Built with Alectryon, running Coq+SerAPI v8.13.0+0.13.0. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
Notation "[ rel _ _ | _ ]" was already used in scope fun_scope. [notation-overridden,parsing]
Notation "[ rel _ _ : _ | _ ]" was already used in scope fun_scope. [notation-overridden,parsing]
Notation "[ rel _ _ in _ & _ | _ ]" was already used in scope fun_scope. [notation-overridden,parsing]
Notation "[ rel _ _ in _ & _ ]" was already used in scope fun_scope. [notation-overridden,parsing]
Notation "[ rel _ _ in _ | _ ]" was already used in scope fun_scope. [notation-overridden,parsing]
Notation "[ rel _ _ in _ ]" was already used in scope fun_scope. [notation-overridden,parsing]
Notation "_ + _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ - _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ <= _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ < _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ >= _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ > _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ <= _ <= _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ < _ <= _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ <= _ < _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ < _ < _" was already used in scope nat_scope. [notation-overridden,parsing]
Notation "_ * _" was already used in scope nat_scope. [notation-overridden,parsing]
From hanoi Require Import extra gdist ghanoi ghanoi3. Set Implicit Arguments. Unset Strict Implicit. Unset Printing Implicit Defensive. Section Hanoi3. (*****************************************************************************) (* The pegs are the three elements of 'I_3 *) (*****************************************************************************) Implicit Type p : peg 3. Local Notation "c1 `-->_r c2" := (rmove c1 c2) (format "c1 `-->_r c2", at level 60). Local Notation "c1 `-->*_r c2" := (connect rmove c1 c2) (format "c1 `-->*_r c2", at level 60). (******************************************************************************) (* Function that builds a path from peg to peg *) (******************************************************************************) Fixpoint ppeg {n : nat} p1 p2 := if n isn't n1.+1 return seq (configuration 3 n) then [::] else let p3 := `p[p1, p2] in [seq ↑[i]_p1 | i <- ppeg p1 p3] ++ [seq ↑[i]_p2 | i <- `c[p3] :: ppeg p3 p2].
n:nat
p1, p2:peg 3

size (ppeg p1 p2 : seq (configuration 3 n)) = (2 ^ n).-1
n:nat
p1, p2:peg 3

size (ppeg p1 p2 : seq (configuration 3 n)) = (2 ^ n).-1
n:nat
IH:forall p1 p2, size (ppeg p1 p2) = (2 ^ n).-1
p1, p2:peg 3

size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
n:nat
IH:forall p1 p2, size (ppeg p1 p2) = (2 ^ n).-1
p1, p2:peg 3

(2 ^ n).-1 + (2 ^ n).-1.+1 = (2 ^ n + 2 ^ n).-1
by rewrite -(prednK (_ : 0 < 2 ^ n)) // expn_gt0. Qed.
n:nat
p1, p2:peg 3
c:configuration 3 n
cs:=ppeg p1 p2 : seq (configuration 3 n):seq (configuration 3 n)

last c cs = `c[p2]
n:nat
p1, p2:peg 3
c:configuration 3 n
cs:=ppeg p1 p2 : seq (configuration 3 n):seq (configuration 3 n)

last c cs = `c[p2]
n:nat
p1, p2:peg 3
c:configuration 3 n
cs:=ppeg p1 p2 : seq (configuration 3 n):seq (configuration 3 n)
HH:irreflexive (rrel (n:=3))

last c cs = `c[p2]
HH:irreflexive (rrel (n:=3))
p2:peg 3
c:configuration 3 0

c = `c[p2]
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2 (c : configuration 3 n), last c (ppeg p1 p2) = `c[p2]
p1, p2:peg 3
c:configuration 3 n.+1
last c ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = `c[p2]
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2 (c : configuration 3 n), last c (ppeg p1 p2) = `c[p2]
p1, p2:peg 3
c:configuration 3 n.+1

last c ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = `c[p2]
by rewrite last_cat /= last_map IH perfect_liftr. Qed.
n:nat
p1, p2:peg 3
cs:=ppeg p1 p2 : seq (configuration 3 n):seq (configuration 3 n)

p1 != p2 -> path rmove `c[p1] cs
n:nat
p1, p2:peg 3
cs:=ppeg p1 p2 : seq (configuration 3 n):seq (configuration 3 n)

p1 != p2 -> path rmove `c[p1] cs
n:nat
p1, p2:peg 3
cs:=ppeg p1 p2 : seq (configuration 3 n):seq (configuration 3 n)
HH:irreflexive (rrel (n:=3))

p1 != p2 -> path rmove `c[p1] cs
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2, p1 != p2 -> path rmove `c[p1] (ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2

path rmove `c[p1] ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2, p1 != p2 -> path rmove `c[p1] (ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
p3:=`p[p1, p2]:peg 3

path rmove `c[p1] ([seq ↑[i]_p1 | i <- ppeg p1 p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2, p1 != p2 -> path rmove `c[p1] (ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
p3:=`p[p1, p2]:peg 3
p1Dp3:p1 != p3

path rmove `c[p1] ([seq ↑[i]_p1 | i <- ppeg p1 p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2, p1 != p2 -> path rmove `c[p1] (ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
p3:=`p[p1, p2]:peg 3
p1Dp3:p1 != p3
p3Dp2:p3 != p2

path rmove `c[p1] ([seq ↑[i]_p1 | i <- ppeg p1 p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2, p1 != p2 -> path rmove `c[p1] (ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
p3:=`p[p1, p2]:peg 3
p1Dp3:p1 != p3
p3Dp2:p3 != p2

[&& path (move (rrel (n:=3))) `c[p1] (ppeg p1 p3), last `c[p1] [seq ↑[i]_p1 | i <- ppeg p1 p3] `-->_r ↑[`c[p3]]_p2 & path (move (rrel (n:=3))) `c[p3] (ppeg p3 p2)]
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2, p1 != p2 -> path rmove `c[p1] (ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
p3:=`p[p1, p2]:peg 3
p1Dp3:p1 != p3
p3Dp2:p3 != p2

last `c[p1] [seq ↑[i]_p1 | i <- ppeg p1 p3] `-->_r ↑[`c[p3]]_p2
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall p1 p2, p1 != p2 -> path rmove `c[p1] (ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
p3:=`p[p1, p2]:peg 3
p1Dp3:p1 != p3
p3Dp2:p3 != p2

↑[`c[p3]]_p1 `-->_r ↑[`c[p3]]_p2
by apply: move_liftr_perfect; rewrite // eq_sym opegDr. Qed. (* We can go from any perfect configuration to a perfect configuration *)
n:nat
p1, p2:peg 3

`c[p1 , n] `-->*_r `c[p2]
n:nat
p1, p2:peg 3

`c[p1 , n] `-->*_r `c[p2]
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

`c[p1] `-->*_r `c[p2]
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

`c[p2] = last `c[p1] (ppeg p1 p2)
by rewrite last_ppeg. Qed. (* The proof is done by inspecting the moves that the last disk is doing in cs*) (* We use a double induction : *) (* The first induction is used when the path has duplicates *) (* The second induction is on n and to bound recursive call *)
n:nat
p1, p2:peg 3
cs:seq (configuration 3 n)

p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
p1, p2:peg 3
cs:seq (configuration 3 n)

p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
p1, p2:peg 3
cs:seq (configuration 3 n)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))

p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
(* The first induction is used when the path has duplicates (1 case) *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
p1, p2:peg 3
cs:seq (configuration 3 n)
sLm:size cs < m.+1

p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2

path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2

size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
(* Is there a move of the last first disk *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2

let c' := ↓[`c[p1]] in let cs' := [seq ↓[i] | i <- cs] in let p := `c[p1] ldisk in cs = [seq ↑[i]_p | i <- cs'] -> path (move (rrel (n:=3))) c' cs' -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
(* No move : impossible since p1 != p2 *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2

`c[p1] ldisk == `c[p2] ldisk -> (2 ^ n.+1).-1 <= 0 ?= iff ([::] == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
a:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
sLm:(size cs).+1 < m.+1
a :: cs = ↑[↓[a]]_(`c[p1] ldisk) :: [seq ↑[i]_(`c[p1] ldisk) | i <- [seq ↓[i] | i <- cs]] -> move (rrel (n:=3)) ↓[`c[p1]] ↓[a] && path (move (rrel (n:=3))) ↓[a] [seq ↓[i] | i <- cs] -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last a cs = `c[p2] -> (2 ^ n.+1).-1 <= (size cs).+1 ?= iff (a :: cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
a:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
sLm:(size cs).+1 < m.+1

a :: cs = ↑[↓[a]]_(`c[p1] ldisk) :: [seq ↑[i]_(`c[p1] ldisk) | i <- [seq ↓[i] | i <- cs]] -> move (rrel (n:=3)) ↓[`c[p1]] ↓[a] && path (move (rrel (n:=3))) ↓[a] [seq ↓[i] | i <- cs] -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last a cs = `c[p2] -> (2 ^ n.+1).-1 <= (size cs).+1 ?= iff (a :: cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
a:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
sLm:(size cs).+1 < m.+1
acsE:a :: cs = ↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]]
lacsE:last a cs = `c[p2]

(2 ^ n.+1).-1 <= (size cs).+1 ?= iff (a :: cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
a:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
sLm:(size cs).+1 < m.+1
acsE:a :: cs = ↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]]
lacsE:last a cs = `c[p2]

last a cs \in a :: cs -> (2 ^ n.+1).-1 <= (size cs).+1 ?= iff (a :: cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
a:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
sLm:(size cs).+1 < m.+1
acsE:a :: cs = ↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]]
lacsE:last a cs = `c[p2]

`c[p2] ldisk == ↑[↓[a]]_p1 ldisk -> (2 ^ n.+1).-1 <= (size cs).+1 ?= iff (↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]] == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
a:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
sLm:(size cs).+1 < m.+1
acsE:a :: cs = ↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]]
lacsE:last a cs = `c[p2]
`c[p2] \in [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]] -> (2 ^ n.+1).-1 <= (size cs).+1 ?= iff (↑[↓[a]]_p1 :: [ seq ↑[i]_p1 | i <- [ seq ↓[i] | i <- cs]] == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
a:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
sLm:(size cs).+1 < m.+1
acsE:a :: cs = ↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]]
lacsE:last a cs = `c[p2]

`c[p2] \in [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]] -> (2 ^ n.+1).-1 <= (size cs).+1 ?= iff (↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]] == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
p1Dp2:p1 != p2
a:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
sLm:(size cs).+1 < m.+1
acsE:a :: cs = ↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]]
lacsE:last a cs = `c[p2]
c:finfun_eqType (ordinal_finType n) (ordinal_eqType 3)

`c[p2] ldisk == ↑[c]_p1 ldisk -> (2 ^ n.+1).-1 <= (size cs).+1 ?= iff (↑[↓[a]]_p1 :: [seq ↑[i]_p1 | i <- [seq ↓[i] | i <- cs]] == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2

forall (cs1 : seq (configuration 3 n)) (cs2 : seq (configuration 3 n.+1)), let p3 := `c[p1] ldisk in forall p4, let p5 := `p[p3, p4] in let c1 := ↓[`c[p1]] in let c2 := ↑[`c[p5]]_p4 in p3 != p4 -> rrel p3 p4 -> last c1 cs1 = `c[p5] -> cs = [seq ↑[i1]_p3 | i1 <- cs1] ++ c2 :: cs2 -> path (move (rrel (n:=3))) c1 cs1 -> path (move (rrel (n:=3))) c2 cs2 -> size ([seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i3]_p1 | i3 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i3]_p2 | i3 <- ppeg `p[p1, p2] p2])
(* There is a move from p1 to p3 *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3

last `c[p1] cs1 = `c[`p[p1, p3]] -> cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2 -> path (move (rrel (n:=3))) `c[p1] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[p1, p3]]]_p3 cs2 -> size ([seq ↑[i1]_p1 | i1 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i1]_p2 | i1 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i1]_p1 | i1 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i1]_p2 | i1 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1

path (move (rrel (n:=3))) ↑[`c[`p[p1, p3]]]_p3 cs2 -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1

size cs1 < m.+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
path (move (rrel (n:=3))) ↑[`c[`p[p1, p3]]]_p3 cs2 -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1

path (move (rrel (n:=3))) ↑[`c[`p[p1, p3]]]_p3 cs2 -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]

path (move (rrel (n:=3))) ↑[`c[`p[p1, p3]]]_p3 cs2 -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
(* After the first move, last disk is on p3, the other disk is `p[p1, p3] *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])

path (move (rrel (n:=3))) ↑[`c[`p[p1, p3]]]_p3 cs2 -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])

(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
path (move (rrel (n:=3))) ↑[`c[`p[p1, p3]]]_p3 cs2 -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1

path (move (rrel (n:=3))) ↑[`c[`p[p1, p3]]]_p3 cs2 -> size ([seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i0]_p1 | i0 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i0]_p2 | i0 <- ppeg `p[p1, p2] p2])
(* Is there another move *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1

cs2 = [seq ↑[i]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i <- [seq ↓[i] | i <- cs2]] -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] [seq ↓[i] | i <- cs2] -> true -> size ([seq ↑[i1]_p1 | i1 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i1]_p2 | i1 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i1]_p1 | i1 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i1]_p2 | i1 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
(* there is no move so p3 = p2 and simple induction should make it *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1

cs2 = [seq ↑[i]_p3 | i <- [seq ↓[i] | i <- cs2]] -> path (move (rrel (n:=3))) `c[`p[p1, p3]] [seq ↓[i] | i <- cs2] -> true -> size ([seq ↑[i1]_p1 | i1 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i1]_p2 | i1 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i1]_p1 | i1 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i1]_p2 | i1 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs2E:cs2 = [seq ↑[i]_p3 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p3]] [seq ↓[i] | i <- cs2]
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs2E:cs2 = [seq ↑[i]_p3 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p3]] [seq ↓[i] | i <- cs2]
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]

p3 = p2
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs2E:cs2 = [seq ↑[i]_p3 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p3]] [seq ↓[i] | i <- cs2]
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs2E:cs2 = [seq ↑[i]_p3 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p3]] [seq ↓[i] | i <- cs2]
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1

↑[last `c[`p[p1, p3]] [seq ↓[i] | i <- cs2]]_p3 = `c[p2] -> p3 = p2
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs2E:cs2 = [seq ↑[i]_p3 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p3]] [seq ↓[i] | i <- cs2]
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs2E:cs2 = [seq ↑[i]_p3 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p3]] [seq ↓[i] | i <- cs2]
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]

size [seq ↓[i] | i <- cs2] < m.+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]

size [seq ↓[i] | i <- cs2] < (size cs).+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1

last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1

↓[last ↑[`c[`p[p1, p2]]]_p2 cs2] = `c[p2]
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p2])
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 = size cs1

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 = size [seq ↓[i] | i <- cs2]

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 < size [seq ↓[i] | i <- cs2]
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 = size cs2

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 < size [seq ↓[i] | i <- cs2]
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 = size cs2

(2 ^ n).-1 + (2 ^ n).-1.+1 <= (2 ^ n).-1 + (2 ^ n).-1.+1 ?= iff true
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 < size [seq ↓[i] | i <- cs2]
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 < size [seq ↓[i] | i <- cs2]

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 < size [seq ↓[i] | i <- cs2]

(2 ^ n.+1).-1 == size ([seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 < size [seq ↓[i] | i <- cs2]
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 < size [seq ↓[i] | i <- cs2]

(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 = size cs1
HL2:(2 ^ n).-1 < size cs2

(2 ^ n.+1).-1 < size cs1 + (size cs2).+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1
(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL2:(2 ^ n).-1 <= size [seq ↓[i] | i <- cs2] ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)
HL1:(2 ^ n).-1 < size cs1

(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p3E:p3 = p2
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p2]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p2]]]_p2 :: cs2
cs2E:cs2 = [seq ↑[i]_p2 | i <- [seq ↓[i] | i <- cs2]]
p1p3Pcs2:path (move (rrel (n:=3))) `c[`p[p1, p2]] [seq ↓[i] | i <- cs2]
Scs2:size [seq ↓[i] | i <- cs2] < m.+1
p1p2Lcs2:last `c[`p[p1, p2]] [seq ↓[i] | i <- cs2] = `c[p2]
HL1:(2 ^ n).-1 < size cs1
HL2:(2 ^ n).-1 <= size cs2 ?= iff ([seq ↓[i] | i <- cs2] == ppeg `p[p1, p2] p2)

(2 ^ n.+1).-1 < size cs1 + (size cs2).+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [ seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1

forall (cs1 : seq (configuration 3 n)) (cs3 : seq (configuration 3 n.+1)) p4, ↑[`c[`p[p1, p3]]]_p3 ldisk != p4 -> rrel (↑[`c[`p[p1, p3]]]_p3 ldisk) p4 -> last ↓[↑[`c[`p[p1, p3]]]_p3] cs1 = `c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]] -> cs2 = [seq ↑[i1]_(↑[`c[`p[p1, p3]]]_p3 ldisk) | i1 <- cs1] ++ ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 :: cs3 -> path (move (rrel (n:=3))) ↓[↑[`c[`p[p1, p3]]]_p3] cs1 -> path (move (rrel (n:=3))) ↑[`c[`p[↑[`c[`p[p1, p3]]]_p3 ldisk, p4]]]_p4 cs3 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3

p3 != p4 -> rrel p3 p4 -> last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]] -> cs2 = [seq ↑[i1]_p3 | i1 <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4 -> path rmove `c[`p[p1, p3]] cs3 -> path rmove ↑[`c[`p[p3, p4]]]_p4 cs4 -> true -> size ([seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1 -> true -> last `c[p1] cs = `c[p2] -> (2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i4]_p1 | i4 <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i4]_p2 | i4 <- ppeg `p[p1, p2] p2])
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]

(2 ^ n.+1).-1 <= size cs ?= iff (cs == [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2])
(* we did two moves of the largest disk so we cannot be = *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]

size cs = size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) -> (2 ^ n.+1).-1 == size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]

(2 ^ n.+1).-1 < size cs
(* Did we come back to p1 *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1

(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4

(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
(* if so cs has a repetition so we can use IHm *)
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)

(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)

size cs' < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)

size cs1 + size cs4 < size cs1 + (size cs3 + (size cs4).+1).+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs

(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs

(2 ^ n.+1).-1 <= size cs'
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs

path rmove `c[p1] cs'
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs
last `c[p1] cs' = `c[p2]
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs

path rmove ↑[`c[p1]]_p1 [seq ↑[i]_p1 | i <- cs1] && path rmove (last ↑[`c[p1]]_p1 [seq ↑[i]_p1 | i <- cs1]) cs4
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs
last `c[p1] cs' = `c[p2]
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs

last `c[p1] cs' = `c[p2]
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs

last (last ↑[`c[p1]]_p1 [seq ↑[i]_p1 | i <- cs1]) cs4 = `c[p2]
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs

last ↑[`c[`p[p1, p3]]]_p1 cs4 = `c[p2]
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Ep1:p4 = p1
p3Dp4:p3 != p1
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p1]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p1]]]_p1 :: cs4
p3p4Pcs4:path rmove ↑[`c[`p[p3, p1]]]_p1 cs4
cs':=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
Scs':size cs' < size cs

last `c[p1] cs = `c[p2] -> last ↑[`c[`p[p1, p3]]]_p1 cs4 = `c[p2]
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1

(2 ^ n.+1).-1 < size cs
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1

(2 ^ n).-1 + (2 ^ n).-1 <= size cs1 + size cs3 + size cs4
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1

(2 ^ n).-1 <= size cs3
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1

size cs3 < m.+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
Scs3:size cs3 < m.+1
(2 ^ n).-1 <= size cs3
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1

size cs3 < (size cs).+1
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
Scs3:size cs3 < m.+1
(2 ^ n).-1 <= size cs3
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1

size cs3 <= size cs3 + size cs4 + (size cs1).+2
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
Scs3:size cs3 < m.+1
(2 ^ n).-1 <= size cs3
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
Scs3:size cs3 < m.+1

(2 ^ n).-1 <= size cs3
irrH:irreflexive (rrel (n:=3))
symH:symmetric (rrel (n:=3))
m:nat
IHm:forall (n : nat) p1 p2 (cs : seq (configuration 3 n)), size cs < m -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
n:nat
IH:forall p1 p2 (cs : seq (configuration 3 n)), size cs < m.+1 -> p1 != p2 -> path rmove `c[p1] cs -> last `c[p1] cs = `c[p2] -> (2 ^ n).-1 <= size cs ?= iff (cs == ppeg p1 p2)
p1, p2:peg 3
cs:seq (configuration 3 n.+1)
sLm:size cs < m.+1
p1Dp2:p1 != p2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p3:peg 3
p1Dp3:p1 != p3
p1cs1Lp1p3:last `c[p1] cs1 = `c[`p[p1, p3]]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ ↑[`c[`p[p1, p3]]]_p3 :: cs2
p1Pcs1:path (move (rrel (n:=3))) `c[p1] cs1
Scs1:size cs1 < m.+1
p1Dp1p3:p1 != `p[p1, p3]
HL1:(2 ^ n).-1 <= size cs1 ?= iff (cs1 == ppeg p1 `p[p1, p3])
n2E:(2 ^ n.+1).-1 = (2 ^ n).-1 + (2 ^ n).-1.+1
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p3Dp4:p3 != p4
p1p3cs3Lp3p4:last `c[`p[p1, p3]] cs3 = `c[`p[p3, p4]]
cs2E:cs2 = [seq ↑[i]_p3 | i <- cs3] ++ ↑[`c[`p[p3, p4]]]_p4 :: cs4
p1p3Pcs3:path rmove `c[`p[p1, p3]] cs3
p3p4Pcs4:path rmove ↑[`c[`p[p3, p4]]]_p4 cs4
sH:size ([seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]) = (2 ^ n.+1).-1
p1csLp2:last `c[p1] cs = `c[p2]
p4Dp1:p4 != p1
Scs3:size cs3 < m.+1

`p[p1, p3] != `p[p3, p4]
by rewrite opeg3E // eq_sym opeg3E // eq_sym p1Dp3 p4Dp1 eq_sym opegDl. Qed.
n:nat
p1, p2:peg 3

`d[`c[p1 , n], `c[p2]]_rmove = (2 ^ n).-1 * (p1 != p2)
n:nat
p1, p2:peg 3

`d[`c[p1 , n], `c[p2]]_rmove = (2 ^ n).-1 * (p1 != p2)
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

`d[`c[p1], `c[p2]]_rmove = (2 ^ n).-1 * ~~ false
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

`d[`c[p1], `c[p2]]_rmove = (2 ^ n).-1
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

`d[`c[p1], `c[p2]]_rmove <= size (ppeg p1 p2) <= `d[`c[p1], `c[p2]]_rmove
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

path rmove `c[p1] (ppeg p1 p2)
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
last `c[p1] (ppeg p1 p2) = `c[p2]
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
size (ppeg p1 p2) <= `d[`c[p1], `c[p2]]_rmove
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

path rmove `c[p1] (ppeg p1 p2)
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
last `c[p1] (ppeg p1 p2) = `c[p2]
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
size (ppeg p1 p2) <= `d[`c[p1], `c[p2]]_rmove
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

last `c[p1] (ppeg p1 p2) = `c[p2]
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
size (ppeg p1 p2) <= `d[`c[p1], `c[p2]]_rmove
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

last `c[p1] (ppeg p1 p2) = `c[p2]
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
size (ppeg p1 p2) <= `d[`c[p1], `c[p2]]_rmove
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

size (ppeg p1 p2) <= `d[`c[p1], `c[p2]]_rmove
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2

`c[p1] `-->*_r `c[p2]
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
cs:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
csH:gpath rmove `c[p1] `c[p2] cs
size (ppeg p1 p2) <= `d[`c[p1], `c[p2]]_rmove
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
cs:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
csH:gpath rmove `c[p1] `c[p2] cs

size (ppeg p1 p2) <= `d[`c[p1], `c[p2]]_rmove
n:nat
p1, p2:peg 3
p1Dp2:p1 != p2
cs:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
csH:gpath rmove `c[p1] `c[p2] cs

(2 ^ n).-1 <= size cs
n:nat
p1, p2:peg 3
cs:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
csH:gpath rmove `c[p1] `c[p2] cs

last `c[p1] cs = `c[p2]
by apply: gpath_last csH. Qed. (*****************************************************************************) (* Function that builds a path from a configuration to a peg *) (*****************************************************************************) Fixpoint rpeg {n : nat} := if n is n1.+1 return configuration 3 n -> peg 3 -> seq (configuration 3 n) then fun c p => let p1 := c ldisk in if p1 == p then [seq ↑[i]_p | i <- rpeg ↓[c] p] else let p2 := `p[p1, p] in [seq ↑[i]_p1 | i <- rpeg ↓[c] p2] ++ [seq ↑[i]_p | i <- `c[p2] :: ppeg p2 p] else fun _ _ => [::].
n:nat
p:peg 3

rpeg `c[p] p = [::]
n:nat
p:peg 3

rpeg `c[p] p = [::]
p:peg 3
n:nat
IH:rpeg `c[p] p = [::]

(if `c[p] ldisk == p then [seq ↑[i]_p | i <- rpeg ↓[`c[p]] p] else [seq ↑[i]_(`c[p] ldisk) | i <- rpeg ↓[`c[p]] `p[`c[p] ldisk, p]] ++ ↑[`c[`p[`c[p] ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[`c[p] ldisk, p] p]) = [::]
by rewrite ffunE eqxx perfect_unliftr IH. Qed.
n:nat
c:configuration 3 n
p:peg 3

rpeg c p = [::] -> c = `c[p]
n:nat
c:configuration 3 n
p:peg 3

rpeg c p = [::] -> c = `c[p]
p:peg 3
n:nat
IH:forall c : configuration 3 n, rpeg c p = [::] -> c = `c[p]
c:configuration 3 n.+1

(if c ldisk == p then [seq ↑[i]_p | i <- rpeg ↓[c] p] else [seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p]) = [::] -> c = `c[p]
p:peg 3
n:nat
IH:forall c : configuration 3 n, rpeg c p = [::] -> c = `c[p]
c:configuration 3 n.+1
H:c ldisk = p

[seq ↑[i]_p | i <- rpeg ↓[c] p] = [::] -> c = `c[p]
p:peg 3
n:nat
IH:forall c : configuration 3 n, rpeg c p = [::] -> c = `c[p]
c:configuration 3 n.+1
H:c ldisk = p

[seq ↑[i]_p | i <- rpeg ↓[c] p] = [::] -> ↑[↓[c]]_(c ldisk) = `c[p]
p:peg 3
n:nat
IH:forall c : configuration 3 n, rpeg c p = [::] -> c = `c[p]
c:configuration 3 n.+1
H:c ldisk = p

↑[`c[p]]_(c ldisk) = `c[p]
by rewrite H perfect_liftr. Qed.
n:nat
p1, p2:peg 3

p1 != p2 -> rpeg `c[p1 , n] p2 = ppeg p1 p2
n:nat
p1, p2:peg 3

p1 != p2 -> rpeg `c[p1 , n] p2 = ppeg p1 p2
n:nat
IH:forall p1 p2, p1 != p2 -> rpeg `c[p1] p2 = ppeg p1 p2
p1, p2:peg 3
p1Dp2:p1 != p2

(if `c[p1] ldisk == p2 then [seq ↑[i]_p2 | i <- rpeg ↓[`c[p1]] p2] else [seq ↑[i]_(`c[p1] ldisk) | i <- rpeg ↓[`c[p1]] `p[`c[p1] ldisk, p2]] ++ ↑[`c[`p[`c[p1] ldisk, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[`c[p1] ldisk, p2] p2]) = [seq ↑[i]_p1 | i <- ppeg p1 `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- ppeg `p[p1, p2] p2]
by rewrite ffunE perfect_unliftr (negPf p1Dp2) !IH // eq_sym opegDl. Qed.
n:nat
c:configuration 3 n
p:peg 3
cs:=rpeg c p:seq (configuration 3 n)

last c cs = `c[p]
n:nat
c:configuration 3 n
p:peg 3
cs:=rpeg c p:seq (configuration 3 n)

last c cs = `c[p]
c:configuration 3 0
p:peg 3

c = `c[p]
n:nat
IH:forall (c : configuration 3 n) p, last c (rpeg c p) = `c[p]
c:configuration 3 n.+1
p:peg 3
last c (if c ldisk == p then [seq ↑[i]_p | i <- rpeg ↓[c] p] else [seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p]) = `c[p]
n:nat
IH:forall (c : configuration 3 n) p, last c (rpeg c p) = `c[p]
c:configuration 3 n.+1
p:peg 3

last c (if c ldisk == p then [seq ↑[i]_p | i <- rpeg ↓[c] p] else [seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p]) = `c[p]
n:nat
IH:forall (c : configuration 3 n) p, last c (rpeg c p) = `c[p]
c:configuration 3 n.+1
p:peg 3
Ho:c ldisk = p

last c [seq ↑[i]_p | i <- rpeg ↓[c] p] = `c[p]
n:nat
IH:forall (c : configuration 3 n) p, last c (rpeg c p) = `c[p]
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p
last c ([seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p]) = `c[p]
n:nat
IH:forall (c : configuration 3 n) p, last c (rpeg c p) = `c[p]
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p

last c ([seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p]) = `c[p]
by rewrite last_cat /= last_map last_ppeg perfect_liftr. Qed.
n:nat
c:configuration 3 n
p:peg 3
cs:=rpeg c p:seq (configuration 3 n)

path rmove c cs
n:nat
c:configuration 3 n
p:peg 3
cs:=rpeg c p:seq (configuration 3 n)

path rmove c cs
n:nat
c:configuration 3 n
p:peg 3
cs:=rpeg c p:seq (configuration 3 n)
HH:irreflexive (rrel (n:=3))

path rmove c cs
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3

path rmove c (if c ldisk == p then [seq ↑[i]_p | i <- rpeg ↓[c] p] else [seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p])
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3
Ho:c ldisk = p

path rmove c [seq ↑[i]_p | i <- rpeg ↓[c] p]
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p
path rmove c ([seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p])
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p

path rmove c ([seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p])
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p
c2:=`c[`p[c ldisk, p]]:configuration 3 n

path rmove c ([seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[c2]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p])
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p
c2:=`c[`p[c ldisk, p]]:configuration 3 n

[&& true, last c [seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] `-->_r ↑[c2]_p & true]
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p
c2:=`c[`p[c ldisk, p]]:configuration 3 n

last c [seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] `-->_r ↑[c2]_p
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p
c2:=`c[`p[c ldisk, p]]:configuration 3 n

↑[c2]_(c ldisk) `-->_r ↑[c2]_p
HH:irreflexive (rrel (n:=3))
n:nat
IH:forall (c : configuration 3 n) p, path rmove c (rpeg c p)
c:configuration 3 n.+1
p:peg 3
Do:c ldisk != p
c2:=`c[`p[c ldisk, p]]:configuration 3 n

p != `p[c ldisk, p]
by rewrite eq_sym (opegDr _). Qed. (* We can go from any configuration to a perfect configuration *)
n:nat
c:configuration 3 n
p:peg 3

c `-->*_r `c[p]
n:nat
c:configuration 3 n
p:peg 3

c `-->*_r `c[p]
n:nat
c:configuration 3 n
p:peg 3

`c[p] = last c (rpeg c p)
by rewrite last_rpeg. Qed. (* So we can also from a perfect configuration c to any configuration *)
n:nat
c:configuration 3 n
p:peg 3

`c[p] `-->*_r c
n:nat
c:configuration 3 n
p:peg 3

`c[p] `-->*_r c
n:nat
c:configuration 3 n
p:peg 3

connect (move (rrel (n:=3))) c `c[p]
n:nat
c:configuration 3 n
p:peg 3
symmetric (rrel (n:=3))
n:nat
c:configuration 3 n
p:peg 3

symmetric (rrel (n:=3))
by exact: rsym. Qed. (* Two configurations are always connected *)
n:nat
c1, c2:configuration 3 n

c1 `-->*_r c2
n:nat
c1, c2:configuration 3 n

c1 `-->*_r c2
by apply: connect_trans (move_connect_rpeg c1 (inord 1)) (move_connect_lpeg c2 (inord 1)). Qed. (******************************************************************************) (* Function that builds a path from a configuration to a peg *) (******************************************************************************) (*****************************************************************************) (* Computes the size of rpeg *) (*****************************************************************************) Fixpoint size_rpeg {n : nat} : (configuration _ n) -> _ -> nat := match n with | 0 => fun _ _ => 0 | n1.+1 => fun c p => let p1 := c ldisk in if p1 == p then size_rpeg ↓[c] p else let p2 := `p[p1, p] in size_rpeg ↓[c] p2 + 2 ^ n1 end.
n:nat
p:peg 3
c:configuration 3 n

size_rpeg c p = size (rpeg c p)
n:nat
p:peg 3
c:configuration 3 n

size_rpeg c p = size (rpeg c p)
n:nat
IH:forall p (c : configuration 3 n), size_rpeg c p = size (rpeg c p)
p:peg 3
c:configuration 3 n.+1

(if c ldisk == p then size_rpeg ↓[c] p else size_rpeg ↓[c] `p[c ldisk, p] + 2 ^ n) = size (if c ldisk == p then [seq ↑[i]_p | i <- rpeg ↓[c] p] else [seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p])
n:nat
IH:forall p (c : configuration 3 n), size_rpeg c p = size (rpeg c p)
p:peg 3
c:configuration 3 n.+1
clDp:c ldisk != p

size_rpeg ↓[c] `p[c ldisk, p] + 2 ^ n = size ([seq ↑[i]_(c ldisk) | i <- rpeg ↓[c] `p[c ldisk, p]] ++ ↑[`c[`p[c ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c ldisk, p] p])
by rewrite size_cat /= !size_map size_ppeg prednK ?expn_gt0 // IH. Qed. (* Upper bound on the size *)
n:nat
c:configuration 3 n
p:peg 3

size_rpeg c p <= (2 ^ n).-1
n:nat
c:configuration 3 n
p:peg 3

size_rpeg c p <= (2 ^ n).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3

(if c ldisk == p then size_rpeg ↓[c] p else size_rpeg ↓[c] `p[c ldisk, p] + 2 ^ n) <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3

size_rpeg ↓[c] p <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3
size_rpeg ↓[c] `p[c ldisk, p] + 2 ^ n <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3

(2 ^ n).-1 <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3
size_rpeg ↓[c] `p[c ldisk, p] + 2 ^ n <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3
n1:nat

(2 ^ n.+1 == 0) = false -> n1 < 2 ^ n.+1 -> n1 <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3
size_rpeg ↓[c] `p[c ldisk, p] + 2 ^ n <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3

size_rpeg ↓[c] `p[c ldisk, p] + 2 ^ n <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3

size_rpeg ↓[c] `p[c ldisk, p] + 2 ^ n <= (2 ^ n).-1 + 2 ^ n
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3
(2 ^ n).-1 + 2 ^ n <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3

(2 ^ n).-1 + 2 ^ n <= (2 ^ n.+1).-1
n:nat
IH:forall (c : configuration 3 n) p, size_rpeg c p <= (2 ^ n).-1
c:configuration 3 n.+1
p:peg 3

(2 ^ n).-1 + 2 ^ n <= (2 ^ n + 2 ^ n).-1
by case: (2 ^ n) (expn_eq0 2 n) => [|n1]; rewrite ?addn0. Qed. (* rpeg gives the smallest path to a perfect configuration. *) (* This path is unique *)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)

path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)

path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
(* As we want this statememnt to hold for any configuration c1 *) (* and not just for initial perfect configuration the proof is more *) (* intricate. We need a double induction : *) (* The first induction is used when the path has duplicates (1 case) *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
sLm:size cs < m.+1

path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
(* The usual induction on the number of disks *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]

(if c1 ldisk == p then size_rpeg ↓[c1] p else size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n) <= size cs ?= iff (cs == (if c1 ldisk == p then [ seq ↑[i]_p | i <- rpeg ↓[c1] p] else [ seq ↑[i]_ (c1 ldisk) | i <- rpeg ↓[c1] `p[ c1 ldisk, p]] ++ ↑[`c[`p[ c1 ldisk, p]]]_p :: [ seq ↑[i]_p | i <- ppeg `p[ c1 ldisk, p] p]))
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p

size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
(* the largest disk is already well-placed *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p

last c1 cs ldisk = c1 ldisk
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk

size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]

(if cs == [seq ↑[i]_(c1 ldisk) | i <- cs1] then size cs1 == size cs else size cs1 < size cs) -> size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]

last ↓[c1] cs1 = `c[p]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
(if cs == [seq ↑[i]_(c1 ldisk) | i <- cs1] then size cs1 == size cs else size cs1 < size cs) -> size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]

(if cs == [seq ↑[i]_(c1 ldisk) | i <- cs1] then size cs1 == size cs else size cs1 < size cs) -> size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csEcs1:cs = [seq ↑[i]_(c1 ldisk) | i <- cs1]

size_rpeg ↓[c1] p <= size cs1 ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs
size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csEcs1:cs = [seq ↑[i]_(c1 ldisk) | i <- cs1]

size_rpeg ↓[c1] p <= size cs1 ?= iff (cs1 == rpeg ↓[c1] p)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs
size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csEcs1:cs = [seq ↑[i]_(c1 ldisk) | i <- cs1]

size cs1 < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs
size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs

size_rpeg ↓[c1] p <= size cs ?= iff (cs == [seq ↑[i]_p | i <- rpeg ↓[c1] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs

size_rpeg ↓[c1] p == size [seq ↑[i]_p | i <- rpeg ↓[c1] p]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs
size_rpeg ↓[c1] p < size cs
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs

size_rpeg ↓[c1] p < size cs
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs

size_rpeg ↓[c1] p <= size cs1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nEp:c1 ldisk = p
lcsnEc1n:last c1 cs ldisk = c1 ldisk
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lcsElcs1:last ↓[c1] cs1 = ↓[last c1 cs]
lcs1P:last ↓[c1] cs1 = `c[p]
csDcs1:cs != [seq ↑[i]_(c1 ldisk) | i <- cs1]
scs1L:size cs1 < size cs

size cs1 < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p

size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_ (c1 ldisk) | i <- rpeg ↓[c1] `p[ c1 ldisk, p]] ++ ↑[`c[`p[ c1 ldisk, p]]]_p :: [ seq ↑[i]_p | i <- ppeg `p[ c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk

size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_ (c1 ldisk) | i <- rpeg ↓[c1] `p[ c1 ldisk, p]] ++ ↑[`c[`p[ c1 ldisk, p]]]_p :: [ seq ↑[i]_p | i <- ppeg `p[ c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))

size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_ (c1 ldisk) | i <- rpeg ↓[c1] `p[ c1 ldisk, p]] ++ ↑[`c[`p[ c1 ldisk, p]]]_p :: [ seq ↑[i]_p | i <- ppeg `p[ c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))

size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_ (c1 ldisk) | i <- rpeg ↓[c1] `p[ c1 ldisk, p]] ++ ↑[`c[`p[ c1 ldisk, p]]]_p :: [ seq ↑[i]_p | i <- ppeg `p[ c1 ldisk, p] p])
(* We need to move the largest disk *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
c1':=↓[c1]:configuration 3 n
cs':=[seq ↓[i] | i <- cs]:seq (configuration 3 n)
p1:=c1 ldisk:peg 3
csE:cs = [seq ↑[i]_p1 | i <- cs']
c1'Pcs':path (move (rrel (n:=3))) c1' cs'

size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_ (c1 ldisk) | i <- rpeg ↓[c1] `p[ c1 ldisk, p]] ++ ↑[`c[`p[ c1 ldisk, p]]]_p :: [ seq ↑[i]_p | i <- ppeg `p[ c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
(* this case is impossible the largest disk has to move *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
c1':=↓[c1]:configuration 3 n
cs':=[seq ↓[i] | i <- cs]:seq (configuration 3 n)
p1:=c1 ldisk:peg 3
csE:cs = [seq ↑[i]_p1 | i <- cs']
c1'Pcs':path (move (rrel (n:=3))) c1' cs'

c1 ldisk = p
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
c1':=↓[c1]:configuration 3 n
cs':=[seq ↓[i] | i <- cs]:seq (configuration 3 n)
p1:=c1 ldisk:peg 3
csE:cs = [seq ↑[i]_p1 | i <- cs']
c1'Pcs':path (move (rrel (n:=3))) c1' cs'

f ↑[last ↓[c1] cs']_(c1 ldisk) = f `c[p] -> ↑[↓[c1]]_(c1 ldisk) ldisk = p
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, p]] ++ ↑[`c[`p[c1 ldisk, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[c1 ldisk, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2

size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n <= size cs ?= iff (cs == [seq ↑[i]_ (c1 ldisk) | i <- rpeg ↓[c1] `p[ c1 ldisk, p]] ++ ↑[`c[`p[ c1 ldisk, p]]]_p :: [ seq ↑[i]_p | i <- ppeg `p[ c1 ldisk, p] p])
(* c2 is the first configuration when the largest disk has moved *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p

size cs1 < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p

size cs1 < size cs
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1

size cs2 < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1

size cs2 < size cs
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
(* the first moves of largest disk of cs is the right one *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])

size cs2' < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)

last c2' cs2' = `c[p]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p <= size cs2' ?= iff (cs2' == rpeg c2' p)
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)

↓[last c2 cs2] = ↓[`c[p]]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p <= size cs2' ?= iff (cs2' == rpeg c2' p)
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p <= size cs2' ?= iff (cs2' == rpeg c2' p)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
cs2'L:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c2 ldisk) | i <- cs2'])
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)

(if cs2 == [seq ↑[i]_(c2 ldisk) | i <- cs2'] then size cs2' == size cs2 else size cs2' < size cs2) -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
(* there is only one move of the largest disk in cs *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']

size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']

size_rpeg ↓[c1] p3 + 2 ^ n <= size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
(* the first part of cs is perfect *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']

size_rpeg ↓[c1] p3 + 2 ^ n <= size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- rpeg c2' p2]) ?= iff ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- rpeg c2' p2] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'
size_rpeg ↓[c1] p3 + 2 ^ n <= size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
(* the second part of cs is perfect, only case of equality *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']

size ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- rpeg c2' p2]) = size ([seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2]) -> size_rpeg ↓[c1] p3 + 2 ^ n == size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- rpeg c2' p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
[seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- rpeg c2' p2] = [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'
size_rpeg ↓[c1] p3 + 2 ^ n <= size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']

(size (rpeg c1' p3) + size (rpeg `c[`p[p1, p2]] p2)).+1 = (size (rpeg c1' p3) + size (ppeg p3 p2)).+1 -> size (rpeg ↓[c1] p3) + 2 ^ n == (size (rpeg c1' p3) + size (rpeg `c[`p[p1, p2]] p2)).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
[seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- rpeg c2' p2] = [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'
size_rpeg ↓[c1] p3 + 2 ^ n <= size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']

[seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- rpeg c2' p2] = [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'
size_rpeg ↓[c1] p3 + 2 ^ n <= size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']

[seq ↑[i]_(c2 ldisk) | i <- rpeg c2' p2] = [seq ↑[i]_p2 | i <- ppeg p3 p2]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'
size_rpeg ↓[c1] p3 + 2 ^ n <= size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'

size_rpeg ↓[c1] p3 + 2 ^ n <= size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'

size ([seq ↑[i]_p1 | i <- rpeg c1' p3] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) = size ([seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2]) -> size_rpeg ↓[c1] p3 + 2 ^ n == size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'
size_rpeg ↓[c1] p3 + 2 ^ n < size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'

size (rpeg c1' p3) + (size cs2').+1 = size (rpeg c1' p3) + (size (ppeg p3 p2)).+1 -> size (rpeg ↓[c1] p3) + 2 ^ n == size (rpeg c1' p3) + (size cs2').+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'
size_rpeg ↓[c1] p3 + 2 ^ n < size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'

size_rpeg ↓[c1] p3 + 2 ^ n < size (rpeg c1' p3) + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:size_rpeg c2' p2 < size cs2'

2 ^ n <= size cs2'
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc2:(2 ^ n).-1 < size cs2'

2 ^ n <= size cs2'
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1

size_rpeg ↓[c1] p3 + 2 ^ n <= size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'] == [seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1

size ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2']) = size ([seq ↑[i]_p1 | i <- rpeg ↓[c1] p3] ++ ↑[`c[p3]]_p2 :: [seq ↑[i]_p2 | i <- ppeg p3 p2]) -> size_rpeg ↓[c1] p3 + 2 ^ n == size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n < size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1

size (rpeg ↓[c1] p3) + 2 ^ n == size (rpeg ↓[c1] p3) + (size (ppeg p3 p2)).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1
size_rpeg ↓[c1] p3 + 2 ^ n < size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1

size_rpeg ↓[c1] p3 + 2 ^ n < size cs1 + size (c2 :: [seq ↑[i]_(c2 ldisk) | i <- cs2'])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1

(2 ^ n).-1 <= size cs2'
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2E:cs2 = [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lc1:size_rpeg c1' p3 < size cs1

(2 ^ n).-1 <= size cs2' ?= iff (cs2' == ppeg `p[p1, p2] p2) -> (2 ^ n).-1 <= size cs2'
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2

size ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2) = size ([seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p]) -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n == size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2

size cs1 + (size cs2).+1 = size (rpeg ↓[c1] `p[p1, p]) + (size (ppeg `p[p1, p] p)).+1 -> size (rpeg ↓[c1] `p[p1, p]) + 2 ^ n == size cs1 + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2

size_rpeg ↓[c1] `p[p1, p2] <= size [seq ↑[i]_p1 | i <- cs1]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2
2 ^ n <= size cs2
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2

2 ^ n <= size cs2
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']
Lcs2:size cs2' < size cs2

(2 ^ n).-1 < size cs2
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']

(2 ^ n).-1 <= size cs2'
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Ep:p2 = p
c2':=↓[c2]:configuration 3 n
c2'Epp3:c2' = `c[`p[p1, p2]]
cs2':seq (configuration 3 n)
c2'Pcs2':path (move (rrel (n:=3))) ↓[c2] cs2'
lc2'cs2'E:last ↓[c2] cs2' = ↓[last c2 cs2]
Scs2':size cs2' < m.+1
IHc1:size_rpeg c1' p3 <= size cs1 ?= iff (cs1 == rpeg c1' p3)
IHc2:size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2)
cs2D:cs2 != [seq ↑[i]_(c2 ldisk) | i <- cs2']

size_rpeg c2' p2 <= size cs2' ?= iff (cs2' == rpeg c2' p2) -> (2 ^ n).-1 <= size cs2'
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
(* The largest disk jumped to an intermediate peg *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p

p3 = p
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2) ?= iff ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2 == [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p])
(* cs cannot be optimal *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p

size ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2) = size ([seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p]] ++ ↑[`c[`p[p1, p]]]_p :: [seq ↑[i]_p | i <- ppeg `p[p1, p] p]) -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n == size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p

size cs1 + (size cs2).+1 = size (rpeg ↓[c1] `p[p1, p]) + (size (ppeg `p[p1, p] p)).+1 -> size (rpeg ↓[c1] `p[p1, p]) + 2 ^ n == size cs1 + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c2Pcs2:path (move (rrel (n:=3))) c2 cs2
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
c2':=↓[c2]:configuration 3 n
cs2':=[seq ↓[i] | i <- cs2]:seq (configuration 3 n)

let p0 := c2 ldisk in cs2 = [seq ↑[i]_p0 | i <- cs2'] -> path (move (rrel (n:=3))) c2' cs2' -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i0]_p1 | i0 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
let p2 := c2 ldisk in forall p3, let p4 := `p[p2, p3] in let c3 := ↓[c2] in let c4 := ↑[`c[p4]]_p3 in p2 != p3 -> rrel p2 p3 -> last c3 cs3 = `c[p4] -> cs2 = [seq ↑[i1]_p2 | i1 <- cs3] ++ c4 :: cs4 -> path (move (rrel (n:=3))) c3 cs3 -> path (move (rrel (n:=3))) c4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
(* this is impossible we need another move of the largest disk *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
c2':=↓[c2]:configuration 3 n
cs2':=[seq ↓[i] | i <- cs2]:seq (configuration 3 n)
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs2']
c2'Pcs2':path (move (rrel (n:=3))) c2' cs2'

true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
let p2 := c2 ldisk in forall p3, let p4 := `p[p2, p3] in let c3 := ↓[c2] in let c4 := ↑[`c[p4]]_p3 in p2 != p3 -> rrel p2 p3 -> last c3 cs3 = `c[p4] -> cs2 = [seq ↑[i1]_p2 | i1 <- cs3] ++ c4 :: cs4 -> path (move (rrel (n:=3))) c3 cs3 -> path (move (rrel (n:=3))) c4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p3Ep:p3 = p
c2':=↓[c2]:configuration 3 n
cs2':=[seq ↓[i] | i <- cs2]:seq (configuration 3 n)
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs2']
c2'Pcs2':path (move (rrel (n:=3))) c2' cs2'

p2 = p
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
let p2 := c2 ldisk in forall p3, let p4 := `p[p2, p3] in let c3 := ↓[c2] in let c4 := ↑[`c[p4]]_p3 in p2 != p3 -> rrel p2 p3 -> last c3 cs3 = `c[p4] -> cs2 = [seq ↑[i1]_p2 | i1 <- cs3] ++ c4 :: cs4 -> path (move (rrel (n:=3))) c3 cs3 -> path (move (rrel (n:=3))) c4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p3Ep:p3 = p
c2':=↓[c2]:configuration 3 n
cs2':=[seq ↓[i] | i <- cs2]:seq (configuration 3 n)
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs2']
c2'Pcs2':path (move (rrel (n:=3))) c2' cs2'

last c1 cs = `c[p] -> p2 = p
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
let p2 := c2 ldisk in forall p3, let p4 := `p[p2, p3] in let c3 := ↓[c2] in let c4 := ↑[`c[p4]]_p3 in p2 != p3 -> rrel p2 p3 -> last c3 cs3 = `c[p4] -> cs2 = [seq ↑[i1]_p2 | i1 <- cs3] ++ c4 :: cs4 -> path (move (rrel (n:=3))) c3 cs3 -> path (move (rrel (n:=3))) c4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p3Ep:p3 = p
c2':=↓[c2]:configuration 3 n
cs2':=[seq ↓[i] | i <- cs2]:seq (configuration 3 n)
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs2']
c2'Pcs2':path (move (rrel (n:=3))) c2' cs2'

f (last c2 cs2) = f `c[p] -> p2 = p
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
let p2 := c2 ldisk in forall p3, let p4 := `p[p2, p3] in let c3 := ↓[c2] in let c4 := ↑[`c[p4]]_p3 in p2 != p3 -> rrel p2 p3 -> last c3 cs3 = `c[p4] -> cs2 = [seq ↑[i1]_p2 | i1 <- cs3] ++ c4 :: cs4 -> path (move (rrel (n:=3))) c3 cs3 -> path (move (rrel (n:=3))) c4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)

let p2 := c2 ldisk in forall p3, let p4 := `p[p2, p3] in let c3 := ↓[c2] in let c4 := ↑[`c[p4]]_p3 in p2 != p3 -> rrel p2 p3 -> last c3 cs3 = `c[p4] -> cs2 = [seq ↑[i1]_p2 | i1 <- cs3] ++ c4 :: cs4 -> path (move (rrel (n:=3))) c3 cs3 -> path (move (rrel (n:=3))) c4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p2':=p2:peg 3

forall p2, let p3 := `p[p2', p2] in let c3 := ↓[c2] in let c4 := ↑[`c[p3]]_p2 in p2' != p2 -> rrel p2' p2 -> last c3 cs3 = `c[p3] -> cs2 = [seq ↑[i1]_p2' | i1 <- cs3] ++ c4 :: cs4 -> path (move (rrel (n:=3))) c3 cs3 -> path (move (rrel (n:=3))) c4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3

p2 != p4 -> rrel p2 p4 -> last ↓[c2] cs3 = `c[`p[p2, p4]] -> cs2 = [seq ↑[i1]_p2 | i1 <- cs3] ++ ↑[`c[`p[p2, p4]]]_p4 :: cs4 -> path (move (rrel (n:=3))) ↓[c2] cs3 -> path (move (rrel (n:=3))) ↑[`c[`p[p2, p4]]]_p4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n

p2 != p4 -> rrel p2 p4 -> last c2' cs3 = `c[p5] -> cs2 = [seq ↑[i1]_p2 | i1 <- cs3] ++ ↑[`c[p5]]_p4 :: cs4 -> path (move (rrel (n:=3))) c2' cs3 -> path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4 -> true -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i3]_p1 | i3 <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
(* the path has a duplicate use the induction hypothesis *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3

p4 = p1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4

(p5 != p1) && (p2 != p5) -> p4 = p1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)

size cs5 < size cs
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)

size cs1 + size cs4 < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs

path rmove c1 cs5
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs

path (move (rrel (n:=3))) ↓[c1] cs1 && path rmove (last ↑[↓[c1]]_(c1 ldisk) [seq ↑[i]_p1 | i <- cs1]) cs4
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs

true && path rmove (last ↑[↓[c1]]_(c1 ldisk) [seq ↑[i]_p1 | i <- cs1]) cs4
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5

last c1 cs5 = `c[p]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5

last ↑[`c[p3]]_(c1 ldisk) cs4 = `c[p]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5

last ↑[`c[p3]]_p1 cs4 = last ↑[`c[p5]]_p4 cs4
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]

size cs5 < size [seq ↑[i]_p1 | i <- cs1] + (size cs2).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < (size cs5).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < (size cs5).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size cs5
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]

size cs5 < m
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]
(forall (c : configuration 3 n.+1) p, path rmove c cs5 -> last c cs5 = `c[p] -> size_rpeg c p <= size cs5 ?= iff (cs5 == rpeg c p)) -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size cs5
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]

(size cs5).+1 < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]
(forall (c : configuration 3 n.+1) p, path rmove c cs5 -> last c cs5 = `c[p] -> size_rpeg c p <= size cs5 ?= iff (cs5 == rpeg c p)) -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size cs5
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]

(forall (c : configuration 3 n.+1) p, path rmove c cs5 -> last c cs5 = `c[p] -> size_rpeg c p <= size cs5 ?= iff (cs5 == rpeg c p)) -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size cs5
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Ep3:p5 = p3
p4Ep1:p4 = p1
cs5:=[seq ↑[i]_p1 | i <- cs1] ++ cs4:seq (configuration 3 n.+1)
scs5Lscs:size cs5 < size cs
c1Mcs5:path rmove c1 cs5
lc1cs5E:last c1 cs5 = `c[p]

(if c1 ldisk == p then size_rpeg ↓[c1] p else size_rpeg ↓[c1] `p[c1 ldisk, p] + 2 ^ n) <= size cs5 ?= iff (cs5 == (if c1 ldisk == p then [ seq ↑[i]_p | i <- rpeg ↓[c1] p] else [ seq ↑[i]_ (c1 ldisk) | i <- rpeg ↓[c1] `p[ c1 ldisk, p]] ++ ↑[`c[`p[ c1 ldisk, p]]]_p :: [ seq ↑[i]_p | i <- ppeg `p[ c1 ldisk, p] p])) -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n <= size cs5
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
(* now we just need to use the induction principle on the two subpath *)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
pp5p4Pcs4':path (move (rrel (n:=3))) ↓[↑[`c[p5]]_p4] cs4'
lpp5p4cs4'Elpp5p4cs4:last ↓[↑[`c[p5]]_p4] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'

size cs3 < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'

size cs3 < size cs2
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1

size cs4 < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1

size cs4 < size cs2
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1

size cs4' < m.+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size [seq ↑[i]_p1 | i <- cs1] + size (c2 :: cs2)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
IHc1:size_rpeg c2' p5 <= size cs3 ?= iff (cs3 == rpeg c2' p5)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
IHc1:size_rpeg c2' p5 <= size cs3 ?= iff (cs3 == rpeg c2' p5)
c2'E:c2' = `c[p3]

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:size (ppeg p3 p5) <= size cs3 ?= iff (cs3 == ppeg p3 p5)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)

p5 != p
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
lc1csEp:last c1 cs = `c[p]
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p

last c1 ([seq ↑[i]_p1 | i <- cs1] ++ c2 :: [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4) = `c[p] -> size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]

last `c[p5] cs4' = `c[p]
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:size_rpeg `c[p5] p <= size cs4' ?= iff (cs4' == rpeg `c[p5] p)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:(2 ^ n).-1 <= size cs4' ?= iff (cs4' == ppeg p5 p)

size_rpeg ↓[c1] `p[p1, p] + 2 ^ n < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:(2 ^ n).-1 <= size cs4' ?= iff (cs4' == ppeg p5 p)

size_rpeg ↓[c1] `p[p1, p] + (2 ^ n).-1.+1 < size cs1 + (size cs3 + (size cs4).+1).+1
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:(2 ^ n).-1 <= size cs4' ?= iff (cs4' == ppeg p5 p)

size_rpeg ↓[c1] `p[p1, p] + (2 ^ n).-1 <= size cs1 + (size cs3 + size cs4)
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:(2 ^ n).-1 <= size cs4' ?= iff (cs4' == ppeg p5 p)

size_rpeg ↓[c1] `p[p1, p] + (2 ^ n).-1 <= size cs3 + size cs4
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:(2 ^ n).-1 <= size cs4' ?= iff (cs4' == ppeg p5 p)

size_rpeg ↓[c1] `p[p1, p] <= size cs3
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:(2 ^ n).-1 <= size cs4' ?= iff (cs4' == ppeg p5 p)
(2 ^ n).-1 <= size cs4
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
scs4'L:size cs4' <= size cs4 ?= iff (cs4 == [seq ↑[i]_ (↑[`c[p5]]_p4 ldisk) | i <- cs4'])
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:(2 ^ n).-1 <= size cs4' ?= iff (cs4' == ppeg p5 p)

(2 ^ n).-1 <= size cs4
m:nat
IHm:forall (n : nat) (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
n:nat
IH:forall (c : configuration 3 n) p (cs : seq (configuration 3 n)), size cs < m.+1 -> path rmove c cs -> last c cs = `c[p] -> size_rpeg c p <= size cs ?= iff (cs == rpeg c p)
c1:configuration 3 n.+1
p:peg 3
cs:seq (configuration 3 n.+1)
Scs:size cs < m.+1
c1nDp:c1 ldisk != p
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1:=c1 ldisk:peg 3
p2:peg 3
p3:=`p[p1, p2]:peg 3
c1':=↓[c1]:configuration 3 n
c2:=↑[`c[p3]]_p2:configuration 3 n.+1
p1Dp2:p1 != p2
p1Rp2:rrel p1 p2
lc1'cs1Epp3:last c1' cs1 = `c[p3]
csE:cs = [seq ↑[i]_p1 | i <- cs1] ++ c2 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1Dp:p1 != p
Scs1:size cs1 < m.+1
Scs2:size cs2 < m.+1
p2Dp:p2 != p
p3Ep:p3 = p
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p4:peg 3
p5:=`p[p2, p4]:peg 3
c2':=↓[c2]:configuration 3 n
p2Dp4:p2 != p4
p2Rp4:rrel p2 p4
c2'cs5Epp5:last c2' cs3 = `c[p5]
cs2E:cs2 = [seq ↑[i]_p2 | i <- cs3] ++ ↑[`c[p5]]_p4 :: cs4
c2'Pcs3:path (move (rrel (n:=3))) c2' cs3
pp5p4Pcs4:path (move (rrel (n:=3))) ↑[`c[p5]]_p4 cs4
p5Dp3:p5 != p3
cs4':seq (configuration 3 n)
lpp5p4cs4'Elpp5p4cs4:last `c[p5] cs4' = ↓[last ↑[`c[p5]]_p4 cs4]
pp5p4Pcs4':path (move (rrel (n:=3))) `c[p5] cs4'
Scs3:size cs3 < m.+1
Scs4:size cs4 < m.+1
Scs4':size cs4' < m.+1
c2'E:c2' = `c[p3]
IHc1:(2 ^ n).-1 <= size cs3 ?= iff (cs3 == ppeg p3 p5)
p6Dp:p5 != p
lpp5p4cs4Epp:last ↑[`c[p5]]_p4 cs4 = `c[p]
lpp5cs4'Epp:last `c[p5] cs4' = `c[p]
IHc2:(2 ^ n).-1 <= size cs4' ?= iff (cs4' == ppeg p5 p)

(2 ^ n).-1 <= size cs4'
by rewrite IHc2. Qed.
n:nat
c1:configuration 3 n
p:peg 3

`d[c1, `c[p]]_rmove = size_rpeg c1 p
n:nat
c1:configuration 3 n
p:peg 3

`d[c1, `c[p]]_rmove = size_rpeg c1 p
n:nat
c1:configuration 3 n
p:peg 3

`d[c1, `c[p]]_rmove <= size (rpeg c1 p) <= `d[c1, `c[p]]_rmove
n:nat
c1:configuration 3 n
p:peg 3

path rmove c1 (rpeg c1 p)
n:nat
c1:configuration 3 n
p:peg 3
last c1 (rpeg c1 p) = `c[p]
n:nat
c1:configuration 3 n
p:peg 3
true && (size (rpeg c1 p) <= `d[c1, `c[p]]_rmove)
n:nat
c1:configuration 3 n
p:peg 3

path rmove c1 (rpeg c1 p)
n:nat
c1:configuration 3 n
p:peg 3
last c1 (rpeg c1 p) = `c[p]
n:nat
c1:configuration 3 n
p:peg 3
true && (size (rpeg c1 p) <= `d[c1, `c[p]]_rmove)
n:nat
c1:configuration 3 n
p:peg 3

last c1 (rpeg c1 p) = `c[p]
n:nat
c1:configuration 3 n
p:peg 3
true && (size (rpeg c1 p) <= `d[c1, `c[p]]_rmove)
n:nat
c1:configuration 3 n
p:peg 3

last c1 (rpeg c1 p) = `c[p]
n:nat
c1:configuration 3 n
p:peg 3
true && (size (rpeg c1 p) <= `d[c1, `c[p]]_rmove)
n:nat
c1:configuration 3 n
p:peg 3

true && (size (rpeg c1 p) <= `d[c1, `c[p]]_rmove)
n:nat
c1:configuration 3 n
p:peg 3

c1 `-->*_r `c[p]
n:nat
c1:configuration 3 n
p:peg 3
p1:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
p1H:gpath rmove c1 `c[p] p1
true && (size (rpeg c1 p) <= `d[c1, `c[p]]_rmove)
n:nat
c1:configuration 3 n
p:peg 3
p1:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
p1H:gpath rmove c1 `c[p] p1

true && (size (rpeg c1 p) <= `d[c1, `c[p]]_rmove)
n:nat
c1:configuration 3 n
p:peg 3
p1:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
p1H:gpath rmove c1 `c[p] p1

size_rpeg c1 p <= size p1
n:nat
c1:configuration 3 n
p:peg 3
p1:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
p1H:gpath rmove c1 `c[p] p1

last c1 p1 = `c[p]
by apply: gpath_last p1H. Qed.
n:nat
c:configuration 3 n
p:peg 3

`d[c, `c[p]]_rmove <= (2 ^ n).-1
n:nat
c:configuration 3 n
p:peg 3

`d[c, `c[p]]_rmove <= (2 ^ n).-1
by rewrite gdist_size_rpeg; apply: size_rpeg_up. Qed. (******************************************************************************) (* Function that builds a path from a peg to a configuration *) (******************************************************************************) Definition lpeg n p (c : _ _ n) := rev (belast c (rpeg c p)).
n:nat
p:peg 3

lpeg p `c[p , n] = [::]
n:nat
p:peg 3

lpeg p `c[p , n] = [::]
by rewrite /lpeg rpeg_perfect. Qed.
n:nat
c:configuration 3 n
p:peg 3

lpeg p c = [::] -> c = `c[p]
n:nat
c:configuration 3 n
p:peg 3

lpeg p c = [::] -> c = `c[p]
n:nat
c:configuration 3 n
p:peg 3

(rpeg c p = [::] -> c = `c[p]) -> lpeg p c = [::] -> c = `c[p]
n:nat
c:configuration 3 n
p:peg 3
a:configuration 3 n
l:seq (configuration 3 n)

(a :: l = [::] -> c = `c[p]) -> rev (c :: belast a l) = [::] -> c = `c[p]
by rewrite rev_cons; case: rev. Qed.
n:nat
c:configuration 3 n
p:peg 3
cs:=lpeg p c:seq (configuration 3 n)

path rmove `c[p] cs
n:nat
c:configuration 3 n
p:peg 3
cs:=lpeg p c:seq (configuration 3 n)

path rmove `c[p] cs
n:nat
c:configuration 3 n
p:peg 3
cs:=lpeg p c:seq (configuration 3 n)
HHs:symmetric (rrel (n:=3))

path rmove `c[p] cs
n:nat
c:configuration 3 n
p:peg 3
HHs:symmetric (rrel (n:=3))

path (move (rrel (n:=3))) c (rpeg c p)
by apply: path_rpeg. Qed.
n:nat
c:configuration 3 n
p:peg 3
cs:=lpeg p c:seq (configuration 3 n)

last `c[p] cs = c
n:nat
c:configuration 3 n
p:peg 3
cs:=lpeg p c:seq (configuration 3 n)

last `c[p] cs = c
n:nat
c:configuration 3 n
p:peg 3
cs:=lpeg p c:seq (configuration 3 n)
HHs:symmetric (rrel (n:=3))

(let cs := rpeg c p in last c cs = `c[p]) -> last `c[p] cs = c
n:nat
c:configuration 3 n
p:peg 3
HHs:symmetric (rrel (n:=3))
c1:configuration 3 n
cs:seq (configuration 3 n)

last c1 cs = `c[p] -> last `c[p] (rev (c :: belast c1 cs)) = c
by rewrite rev_cons last_rcons. Qed.
n:nat
c:configuration 3 n
p:peg 3

size_rpeg c p = size (lpeg p c)
n:nat
c:configuration 3 n
p:peg 3

size_rpeg c p = size (lpeg p c)
by rewrite size_rev size_belast size_rpegE. Qed.
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)

path rmove `c[p] cs -> last `c[p] cs = c -> size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)

path rmove `c[p] cs -> last `c[p] cs = c -> size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
(* why this is so complicated???? *)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c

size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))

size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))

path rmove c (rev (belast `c[p] cs))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))

size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))

last c (rev (belast `c[p] cs)) = `c[p]
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
c3:configuration 3 n
cs1:seq (configuration 3 n)

last (last c3 cs1) (rev (`c[p] :: belast c3 cs1)) = `c[p]
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]

size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]

size_rpeg c p <= size (rev (belast `c[p] cs)) ?= iff (rev (belast `c[p] cs) == rpeg c p) -> size_rpeg c p <= size cs ?= iff (cs == lpeg p c)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]

size_rpeg c p <= size cs ?= iff (rev (belast `c[p] cs) == rpeg c p) -> size_rpeg c p <= size cs ?= iff (cs == rev (belast c (rpeg c p)))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)

size_rpeg c p <= size cs ?= iff (u == v) -> size_rpeg c p <= size cs ?= iff (cs == rev (belast c v))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)

(u == v) = (rev (c :: u) == rev (c :: v))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)
size_rpeg c p <= size cs ?= iff (rev (c :: u) == rev (c :: v)) -> size_rpeg c p <= size cs ?= iff (cs == rev (belast c v))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)

(u == v) = (rev u == rev v)
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)
size_rpeg c p <= size cs ?= iff (rev (c :: u) == rev (c :: v)) -> size_rpeg c p <= size cs ?= iff (cs == rev (belast c v))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)

rev u = rev v -> u = v
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)
size_rpeg c p <= size cs ?= iff (rev (c :: u) == rev (c :: v)) -> size_rpeg c p <= size cs ?= iff (cs == rev (belast c v))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)

size_rpeg c p <= size cs ?= iff (rev (c :: u) == rev (c :: v)) -> size_rpeg c p <= size cs ?= iff (cs == rev (belast c v))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)

size_rpeg c p <= size cs ?= iff (rev (c :: u) == last c v :: rev (belast c v)) -> size_rpeg c p <= size cs ?= iff (cs == rev (belast c v))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)

size_rpeg c p <= size cs ?= iff (cs == rev (belast c v)) && (`c[p] == last c v) -> size_rpeg c p <= size cs ?= iff (cs == rev (belast c v))
n:nat
c:configuration 3 n
p:peg 3
cs:seq (configuration 3 n)
pPcs:path rmove `c[p] cs
lccsEc:last `c[p] cs = c
HHs:symmetric (rrel (n:=3))
cPr:path rmove c (rev (belast `c[p] cs))
lcrEp:last c (rev (belast `c[p] cs)) = `c[p]
u:=rev (belast `c[p] cs):seq (configuration 3 n)
v:=rpeg c p:seq (configuration 3 n)
Hcs:cs = rev (belast c v)

`c[p] = last c v
by rewrite last_rpeg. Qed. Fixpoint rhanoi3 {n : nat} := if n is n1.+1 return configuration 3 n -> configuration 3 n -> _ _ then fun c1 c2 => let p1 := c1 ldisk in let p2 := c2 ldisk in let c1' := ↓[c1] in let c2' := ↓[c2] in if p1 == p2 then [seq ↑[i]_p1 | i <- rhanoi3 c1' c2'] else let p := `p[p1, p2] in (* one jump *) let m1 := size_rpeg c1' p + size_rpeg c2' p in (* two jumps *) let m2 := size_rpeg c1' p2 + 2 ^ n1 + size_rpeg c2' p1 in if m1 <= m2 then [seq ↑[i]_p1 | i <- rpeg c1' p] ++ [seq ↑[i]_p2 | i <- `c[p] :: lpeg p c2'] else [seq ↑[i]_p1 | i <- rpeg c1' p2] ++ [seq ↑[i]_p | i <- `c[p2] :: ppeg p2 p1] ++ [seq ↑[i]_p2 | i <- `c[p1] :: lpeg p1 c2'] else fun _ _ => [::].
n:nat
c1, c2:configuration 3 n
cs:=rhanoi3 c1 c2:seq (configuration 3 n)

last c1 cs = c2
n:nat
c1, c2:configuration 3 n
cs:=rhanoi3 c1 c2:seq (configuration 3 n)

last c1 cs = c2
n:nat
c1, c2:configuration 3 n
cs:=rhanoi3 c1 c2:seq (configuration 3 n)
HHr:irreflexive (rrel (n:=3))

last c1 cs = c2
n:nat
c1, c2:configuration 3 n
HHr:irreflexive (rrel (n:=3))

last c1 (rhanoi3 c1 c2) = c2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, last c1 (rhanoi3 c1 c2) = c2
c1, c2:configuration 3 n.+1

last c1 (if c1 ldisk == c2 ldisk then [seq ↑[i]_(c1 ldisk) | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk] <= size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk) then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, c2 ldisk]] ++ ↑[`c[`p[c1 ldisk, c2 ldisk]]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg `p[c1 ldisk, c2 ldisk] ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_(`p[c1 ldisk, c2 ldisk]) :: [seq ↑[i]_(`p[c1 ldisk, c2 ldisk]) | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]]) = c2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, last c1 (rhanoi3 c1 c2) = c2
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk

last c1 (if p1 == p2 then [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] `p[p1, p2] + size_rpeg ↓[c2] `p[p1, p2] <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- lpeg `p[p1, p2] ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_(`p[p1, p2]) :: [seq ↑[i]_(`p[p1, p2]) | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) = c2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, last c1 (rhanoi3 c1 c2) = c2
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1

last c1 (if p1 == p2 then [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] `p[p1, p2] + size_rpeg ↓[c2] `p[p1, p2] <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p2]] ++ c3 :: [seq ↑[i]_p2 | i <- lpeg `p[p1, p2] ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_(`p[p1, p2]) | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) = c2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, last c1 (rhanoi3 c1 c2) = c2
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3

last c1 (if p1 == p2 then [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ c3 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) = c2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, last c1 (rhanoi3 c1 c2) = c2
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Ep2:p1 = p2

last c1 [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] = c2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, last c1 (rhanoi3 c1 c2) = c2
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ c3 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) = c2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, last c1 (rhanoi3 c1 c2) = c2
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

last c1 (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ c3 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) = c2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, last c1 (rhanoi3 c1 c2) = c2
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

last c1 ([seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) = c2
by rewrite last_cat /= last_cat /= last_map last_lpeg cunliftrK. Qed.
n:nat
c1, c2:configuration 3 n
cs:=rhanoi3 c1 c2:seq (configuration 3 n)

path rmove c1 cs
n:nat
c1, c2:configuration 3 n
cs:=rhanoi3 c1 c2:seq (configuration 3 n)

path rmove c1 cs
n:nat
c1, c2:configuration 3 n
cs:=rhanoi3 c1 c2:seq (configuration 3 n)
HHr:irreflexive (rrel (n:=3))

path rmove c1 cs
n:nat
c1, c2:configuration 3 n
HHr:irreflexive (rrel (n:=3))

path rmove c1 (rhanoi3 c1 c2)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1

path rmove c1 (if c1 ldisk == c2 ldisk then [seq ↑[i]_(c1 ldisk) | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk] <= size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk) then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, c2 ldisk]] ++ ↑[`c[`p[c1 ldisk, c2 ldisk]]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg `p[c1 ldisk, c2 ldisk] ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_(`p[c1 ldisk, c2 ldisk]) :: [seq ↑[i]_(`p[c1 ldisk, c2 ldisk]) | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk

path rmove c1 (if p1 == p2 then [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] `p[p1, p2] + size_rpeg ↓[c2] `p[p1, p2] <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p2]] ++ ↑[`c[`p[p1, p2]]]_p2 :: [seq ↑[i]_p2 | i <- lpeg `p[p1, p2] ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_(`p[p1, p2]) :: [seq ↑[i]_(`p[p1, p2]) | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1

path rmove c1 (if p1 == p2 then [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] `p[p1, p2] + size_rpeg ↓[c2] `p[p1, p2] <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] `p[p1, p2]] ++ c3 :: [seq ↑[i]_p2 | i <- lpeg `p[p1, p2] ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_(`p[p1, p2]) | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3

path rmove c1 (if p1 == p2 then [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ c3 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Ep2:p1 = p2

path rmove c1 [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ c3 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c1 (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ c3 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ c4 :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] `-->_r c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] `-->_r c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] `-->_r c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] `-->_r c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

↑[`c[p]]_(c1 ldisk) `-->_r c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

[/\ rrel (↑[`c[p]]_(c1 ldisk) ldisk) (c3 ldisk), forall d2 : ordinal_finType n.+1, ldisk != d2 -> ↑[`c[p]]_(c1 ldisk) d2 = c3 d2, on_top ldisk ↑[`c[p]]_(c1 ldisk) & on_top ldisk c3]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

rrel (↑[`c[p]]_(c1 ldisk) ldisk) (c3 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
dmDd:ldisk != d
↑[`c[p]]_(c1 ldisk) d = c3 d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

rrel (↑[`c[p]]_(c1 ldisk) ldisk) (c3 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
dmDd:ldisk != d
↑[`c[p]]_(c1 ldisk) d = c3 d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
dmDd:ldisk != d

↑[`c[p]]_(c1 ldisk) d = c3 d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
dmDd:ldisk != d

↑[`c[p]]_(c1 ldisk) d = c3 d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
dmDd:ldisk != d
j:'I_1
jE:d = j + n

`c[c1 ldisk] j = `c[p2] j
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk ↑[`c[p]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk ↑[`c[p]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1

c1 ldisk = match tsplit d with | inl j => `c[c1 ldisk] j | inr j => `c[p] j end -> ldisk <= d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
j:'I_n

c1 ldisk == `c[p] j -> ldisk <= d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
j:'I_1
jE:d = j + n
c1 ldisk = `c[c1 ldisk] j -> ldisk <= d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
j:'I_1
jE:d = j + n

c1 ldisk = `c[c1 ldisk] j -> ldisk <= d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk c3
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1

p2 = match tsplit d with | inl j => `c[p2] j | inr j => `c[`p[p1, p2]] j end -> n <= d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d:ordinal_finType n.+1
j:'I_n

p2 == `c[`p[p1, p2]] j -> n <= d
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c3 [seq ↑[i]_p2 | i <- lpeg p ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

last c1 [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

↑[`c[p2]]_(c1 ldisk) `-->_r c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

rrel (c1 ldisk) `p[p1, p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
ldisk != d2 -> match tsplit d2 with | inl j => `c[c1 ldisk] j | inr j => `c[p2] j end = match tsplit d2 with | inl j => `c[`p[p1, p2]] j | inr j => `c[p2] j end
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p2]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

rrel (c1 ldisk) `p[p1, p2]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
ldisk != d2 -> match tsplit d2 with | inl j => `c[c1 ldisk] j | inr j => `c[p2] j end = match tsplit d2 with | inl j => `c[`p[p1, p2]] j | inr j => `c[p2] j end
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p2]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

ldisk != d2 -> match tsplit d2 with | inl j => `c[c1 ldisk] j | inr j => `c[p2] j end = match tsplit d2 with | inl j => `c[`p[p1, p2]] j | inr j => `c[p2] j end
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p2]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

ldisk != d2 -> match tsplit d2 with | inl j => `c[c1 ldisk] j | inr j => `c[p2] j end = match tsplit d2 with | inl j => `c[`p[p1, p2]] j | inr j => `c[p2] j end
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p2]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
j:'I_1
d2E:d2 = j + n

ldisk = d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p2]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk ↑[`c[p2]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk ↑[`c[p2]]_(c1 ldisk)
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

↑[`c[p2]]_(c1 ldisk) ldisk = ↑[`c[p2]]_(c1 ldisk) d2 -> ldisk <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

c1 ldisk = match tsplit d2 with | inl j => `c[c1 ldisk] j | inr j => `c[p2] j end -> n <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
k:'I_n

c1 ldisk == `c[p2] k -> n <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk c4
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

c4 ldisk = c4 d2 -> ldisk <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

`p[p1, p2] = match tsplit d2 with | inl j => `c[`p[p1, p2]] j | inr j => `c[p2] j end -> n <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
k:'I_n

`p[p1, p2] == `c[p2] k -> n <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c4 ([seq ↑[i]_p | i <- ppeg p2 p1] ++ c5 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]])
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c4 [seq ↑[i]_p | i <- ppeg p2 p1]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c4 [seq ↑[i]_p | i <- ppeg p2 p1] `-->_r c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c4 [seq ↑[i]_p | i <- ppeg p2 p1]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c4 [seq ↑[i]_p | i <- ppeg p2 p1] `-->_r c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

p2 != p1
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
last c4 [seq ↑[i]_p | i <- ppeg p2 p1] `-->_r c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

last c4 [seq ↑[i]_p | i <- ppeg p2 p1] `-->_r c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

last c4 [seq ↑[i]_p | i <- ppeg p2 p1] `-->_r c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

↑[`c[p1]]_p `-->_r c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

rrel p p2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
ldisk != d2 -> match tsplit d2 with | inl j => `c[p] j | inr j => `c[p1] j end = match tsplit d2 with | inl j => `c[p2] j | inr j => `c[p1] j end
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p1]]_p
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

rrel p p2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
ldisk != d2 -> match tsplit d2 with | inl j => `c[p] j | inr j => `c[p1] j end = match tsplit d2 with | inl j => `c[p2] j | inr j => `c[p1] j end
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p1]]_p
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

ldisk != d2 -> match tsplit d2 with | inl j => `c[p] j | inr j => `c[p1] j end = match tsplit d2 with | inl j => `c[p2] j | inr j => `c[p1] j end
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p1]]_p
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

ldisk != d2 -> match tsplit d2 with | inl j => `c[p] j | inr j => `c[p1] j end = match tsplit d2 with | inl j => `c[p2] j | inr j => `c[p1] j end
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p1]]_p
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
j:'I_1
d2E:d2 = j + n

ldisk = d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk ↑[`c[p1]]_p
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk ↑[`c[p1]]_p
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk ↑[`c[p1]]_p
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

↑[`c[p1]]_p ldisk = ↑[`c[p1]]_p d2 -> ldisk <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

p = match tsplit d2 with | inl j => `c[p] j | inr j => `c[p1] j end -> n <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
k:'I_n

p == `c[p1] k -> n <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

on_top ldisk c5
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

c5 ldisk = c5 d2 -> ldisk <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1

p2 = match tsplit d2 with | inl j => `c[p2] j | inr j => `c[p1] j end -> n <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
d2:ordinal_finType n.+1
k:'I_n

p2 == `c[p1] k -> n <= d2
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2
path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
HHr:irreflexive (rrel (n:=3))
n:nat
IH:forall c1 c2 : configuration 3 n, path rmove c1 (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
c3:=↑[`c[`p[p1, p2]]]_p2:configuration 3 n.+1
c4:=↑[`c[p2]]_(`p[p1, p2]):configuration 3 n.+1
c5:=↑[`c[p1]]_p2:configuration 3 n.+1
p:=`p[p1, p2]:peg 3
p1Dp2:p1 != p2

path rmove c5 [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]
by rewrite path_liftr // path_lpeg. Qed.
n:nat
c1, c2:configuration 3 n
cs:seq (configuration 3 n)

path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
n:nat
c1, c2:configuration 3 n
cs:seq (configuration 3 n)

path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
n:nat
c1, c2:configuration 3 n
cs:seq (configuration 3 n)
HHr:irreflexive (rrel (n:=3))

path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
n:nat
c1, c2:configuration 3 n
cs:seq (configuration 3 n)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))

path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)

path rmove c1 cs -> last c1 cs = c2 -> size (if c1 ldisk == c2 ldisk then [seq ↑[i]_(c1 ldisk) | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk] <= size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk) then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, c2 ldisk]] ++ ↑[`c[`p[c1 ldisk, c2 ldisk]]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg `p[c1 ldisk, c2 ldisk] ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_(`p[c1 ldisk, c2 ldisk]) :: [seq ↑[i]_(`p[c1 ldisk, c2 ldisk]) | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]]) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk

path rmove c1 cs -> last c1 cs = c2 -> size (if p1 == p2 then [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_p :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Ep2:p1 = p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2

size [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
size (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_p :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Ep2:p1 = p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
lcsmEc1m:last c1 cs ldisk = p1

size [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
size (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_p :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Ep2:p1 = p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
lcsmEc1m:last c1 cs ldisk = p1
cs1:seq (configuration 3 n)
c1Pcs1:path (move (rrel (n:=3))) ↓[c1] cs1
lc1csElcs1:last ↓[c1] cs1 = ↓[last c1 cs]

size [seq ↑[i]_p1 | i <- rhanoi3 ↓[c1] ↓[c2]] <= size cs1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
size (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_p :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2

size (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1 then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_p :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat

size (if u <= v then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_p :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat

minn u v < size cs -> size (if u <= v then [seq ↑[i]_p1 | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p ↓[c2]] else [seq ↑[i]_p1 | i <- rpeg ↓[c1] p2] ++ ↑[`c[p2]]_p :: [seq ↑[i]_p | i <- ppeg p2 p1] ++ ↑[`c[p1]]_p2 :: [seq ↑[i]_p2 | i <- lpeg p1 ↓[c2]]) <= size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
H1:u <= v
Lscs:u < size cs

u < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
H1:v < u
Lscs:v < size cs
(size_rpeg ↓[c1] p2 + (size (ppeg p2 p1) + size_rpeg ↓[c2] p1)).+1 < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
H1:v < u
Lscs:v < size cs

(size_rpeg ↓[c1] p2 + (size (ppeg p2 p1) + size_rpeg ↓[c2] p1)).+1 < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
H1:v < u

size_rpeg ↓[c1] p2 + (size (ppeg p2 p1) + size_rpeg ↓[c2] p1) < v
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
H1:v < u

size (ppeg p2 p1) < 2 ^ n
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat

minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
cs:seq (configuration 3 n.+1)
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk

minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
c1Pcs:path rmove c1 cs
lc1csEc2:last c1 cs = c2

minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
c1':=↓[c1]:configuration 3 n
cs':=[seq ↓[i] | i <- cs]:seq (configuration 3 n)
csE:cs = [seq ↑[i]_(c1 ldisk) | i <- cs']
c1'Pcs':path (move (rrel (n:=3))) c1' cs'

minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
c1':=↓[c1]:configuration 3 n
cs':=[seq ↓[i] | i <- cs]:seq (configuration 3 n)
csE:cs = [seq ↑[i]_(c1 ldisk) | i <- cs']
c1'Pcs':path (move (rrel (n:=3))) c1' cs'

p1 = p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
c1':=↓[c1]:configuration 3 n
cs':=[seq ↓[i] | i <- cs]:seq (configuration 3 n)
csE:cs = [seq ↑[i]_(c1 ldisk) | i <- cs']
c1'Pcs':path (move (rrel (n:=3))) c1' cs'

f (last c1 cs) = f c2 -> p1 = p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
c1':=↓[c1]:configuration 3 n
cs':=[seq ↓[i] | i <- cs]:seq (configuration 3 n)
csE:cs = [seq ↑[i]_(c1 ldisk) | i <- cs']
c1'Pcs':path (move (rrel (n:=3))) c1' cs'

↑[last ↓[c1] cs']_(c1 ldisk) ldisk = c2 ldisk -> p1 = p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2

minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
Lcs:size cs < m.+1
lc1csEc2:last c1 cs = c2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1

minn u v < size cs
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
lc1csEc2:last c1 cs = c2
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2

p4 = p
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2

p3 != p
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
pp4Pcs2':path (move (rrel (n:=3))) ↓[c3] cs2'
pp4cs2'E:last ↓[c3] cs2' = ↓[last c3 cs2]
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]

minn u v <= size cs1 + size cs2'
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]

u <= size cs1 + size cs2'
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]

size_rpeg ↓[c1] p <= size cs1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]
size_rpeg ↓[c2] p <= size cs2'
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]

last ↓[c1] cs1 = `c[p]
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]
size_rpeg ↓[c2] p <= size cs2'
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]

size_rpeg ↓[c2] p <= size cs2'
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Ep2:p3 = p2
p4Ep:p4 = p
cs2':seq (configuration 3 n)
scs2'Lscs2:size cs2' <= size cs2 ?= iff (cs2 == [seq ↑[i]_ (c3 ldisk) | i <- cs2'])
pp4Pcs2':path (move (rrel (n:=3))) `c[p4] cs2'
pp4cs2'E:last `c[p4] cs2' = ↓[last c3 cs2]

last `c[p4] cs2' = ↓[c2]
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2

p3 = p
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p

p4 = p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p

p4 == p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p

(p1 != p2) && ~~ ((p1 != p2) && (p2 != p2))
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p1 != `p[p1, p2]
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p

p1 != `p[p1, p2]
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
c3Pcs2:path (move (rrel (n:=3))) c3 cs2
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
c3':=↓[c3]:configuration 3 n
cs2':=[seq ↓[i] | i <- cs2]:seq (configuration 3 n)
p5:=c3 ldisk:peg 3
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs2']
c3'Pcs2':path (move (rrel (n:=3))) c3' cs2'

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
c3':=↓[c3]:configuration 3 n
cs2':=[seq ↓[i] | i <- cs2]:seq (configuration 3 n)
p5:=c3 ldisk:peg 3
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs2']
c3'Pcs2':path (move (rrel (n:=3))) c3' cs2'

f (last c3 cs2) = f c2 -> minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
c3':=↓[c3]:configuration 3 n
cs2':=[seq ↓[i] | i <- cs2]:seq (configuration 3 n)
p5:=c3 ldisk:peg 3
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs2']
c3'Pcs2':path (move (rrel (n:=3))) c3' cs2'
p3Ep2:p3 = p2

minn u v < (size cs1 + size [seq ↑[i]_p5 | i <- cs2']).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
Lcs:size cs1 + size cs2 < m
lc3cs2Ec2:last c3 cs2 = c2
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p

minn u v < (size cs1 + size cs2).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m

minn u v < (size cs1 + (size cs3 + (size cs4).+1)).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m

minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1

minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1

p7 = p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1

p7 == p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

minn u v <= size ([seq ↑[i]_p1 | i <- cs1] ++ cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) < m
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
path rmove c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
last c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4) = c2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) < m
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
path rmove c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
last c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4) = c2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

path rmove c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
last c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4) = c2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

path rmove c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
last c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4) = c2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

path (move (rrel (n:=3))) ↓[c1] cs1 && path rmove (last c1 [seq ↑[i]_p1 | i <- cs1]) cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
last c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4) = c2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

true && path rmove (last c1 [seq ↑[i]_p1 | i <- cs1]) cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
last c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4) = c2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

last c1 ([seq ↑[i]_p1 | i <- cs1] ++ cs4) = c2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

last ↑[last ↓[c1] cs1]_(c1 ldisk) cs4 = c2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2
size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Ep1:p6 = p1
p7Ep2:p7 = p2

size ([seq ↑[i]_p1 | i <- cs1] ++ cs4) <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1

minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1

p6 = p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Dp2:p6 != p2

p6 = p2
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Dp2:p6 != p2

p5 == p6
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2

minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2

p7 = p1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2

p7 == p1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

minn u v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

v <= size cs1 + ((size cs3).+1 + size cs4)
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

size_rpeg ↓[c1] p2 <= size cs1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
2 ^ n + size_rpeg ↓[c2] p1 <= (size cs3).+1 + size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

last ↓[c1] cs1 = `c[p2]
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
2 ^ n + size_rpeg ↓[c2] p1 <= (size cs3).+1 + size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

2 ^ n + size_rpeg ↓[c2] p1 <= (size cs3).+1 + size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

2 ^ n <= (size cs3).+1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

(2 ^ n).-1 <= size cs3
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

size_rpeg ↓[c3] p1 = (2 ^ n).-1
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
size_rpeg ↓[c3] p1 <= size cs3
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

size_rpeg ↓[c3] p1 <= size cs3
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

last ↓[c3] cs3 = `c[p1]
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1

size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
cs4':seq (configuration 3 n)
c4'Pcs4':path (move (rrel (n:=3))) ↓[c4] cs4'
lc4'cs4'Elc4cs4:last ↓[c4] cs4' = ↓[last c4 cs4]
Lcs4':size cs4' <= size cs4

size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
cs4':seq (configuration 3 n)
lc4'cs4'Elc4cs4:last ↓[c4] cs4' = ↓[last c4 cs4]
Lcs4':size cs4' <= size cs4
c4'Pcs4':path (move (rrel (n:=3))) `c[p1] cs4'

size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
cs4':seq (configuration 3 n)
Lcs4':size cs4' <= size cs4
c4'Pcs4':path (move (rrel (n:=3))) `c[p1] cs4'
lc4'cs4'Elc4cs4:last `c[p1] cs4' = ↓[last c4 cs4]

size_rpeg ↓[c2] p1 <= size cs4
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
cs4':seq (configuration 3 n)
c4'Pcs4':path (move (rrel (n:=3))) `c[p1] cs4'
lc4'cs4'Elc4cs4:last `c[p1] cs4' = ↓[last c4 cs4]

size_rpeg ↓[c2] p1 <= size cs4'
HHr:irreflexive (rrel (n:=3))
HHs:symmetric (rrel (n:=3))
n:nat
IH:forall (c1 c2 : configuration 3 n) (cs : seq (configuration 3 n)), path rmove c1 cs -> last c1 cs = c2 -> size (rhanoi3 c1 c2) <= size cs
c1, c2:configuration 3 n.+1
p:=`p[c1 ldisk, c2 ldisk]:peg 3
p1:=c1 ldisk:(fun=> peg 3) ldisk
p2:=c2 ldisk:(fun=> peg 3) ldisk
p1Dp2:p1 != p2
u:=size_rpeg ↓[c1] p + size_rpeg ↓[c2] p:nat
v:=size_rpeg ↓[c1] p2 + 2 ^ n + size_rpeg ↓[c2] p1:nat
f:=fun_of_fin^~ ldisk:configuration 3 n.+1 -> (fun=> peg 3) ldisk
m:nat
IH1:forall cs : seq (configuration 3 n.+1), size cs < m -> path rmove c1 cs -> last c1 cs = c2 -> minn u v < size cs
cs:seq (configuration 3 n.+1)
cs1:seq (configuration 3 n)
cs2:seq (configuration 3 n.+1)
p1':=c1 ldisk:peg 3
p3:peg 3
p4:=`p[p1', p3]:peg 3
c1':=↓[c1]:configuration 3 n
c3:=↑[`c[p4]]_p3:configuration 3 n.+1
p1Dp3:p1' != p3
p1Rp3:rrel p1' p3
lc1'cs1Epp4:last c1' cs1 = `c[p4]
csE:cs = [seq ↑[i]_p1' | i <- cs1] ++ c3 :: cs2
c1'Pcs1:path (move (rrel (n:=3))) c1' cs1
p1'Ep1:p1' = p1
p3Dp2:p3 != p2
p3Ep:p3 = p
p4Ep2:p4 = p2
cs3:seq (configuration 3 n)
cs4:seq (configuration 3 n.+1)
p5:=c3 ldisk:peg 3
p6:peg 3
p7:=`p[p5, p6]:peg 3
c3':=↓[c3]:configuration 3 n
c4:=↑[`c[p7]]_p6:configuration 3 n.+1
p5Dp6:p5 != p6
p5p6:rrel p5 p6
c3'cs3Epp7:last c3' cs3 = `c[p7]
cs2E:cs2 = [seq ↑[i]_p5 | i <- cs3] ++ c4 :: cs4
c3'Pcs3:path (move (rrel (n:=3))) c3' cs3
c4Pcs4:path (move (rrel (n:=3))) c4 cs4
p5Ep:p5 = p
lc6cs4Ec2:last c4 cs4 = c2
Lcs:size cs1 + (size cs3 + (size cs4).+1) < m
p6Dp1:p6 != p1
p6Ep2:p6 = p2
p7Ep1:p7 = p1
cs4':seq (configuration 3 n)
c4'Pcs4':path (move (rrel (n:=3))) `c[p1] cs4'
lc4'cs4'Elc4cs4:last `c[p1] cs4' = ↓[last c4 cs4]

last `c[p1] cs4' = ↓[c2]
by rewrite lc4'cs4'Elc4cs4 lc6cs4Ec2. Qed. Fixpoint size_rhanoi3 {n : nat} : _ _ n -> _ _ n -> nat := if n is n1.+1 then fun c1 c2 : configuration 3 n1.+1 => let p1 := c1 ldisk in let p2 := c2 ldisk in let c1' := ↓[c1] in let c2' := ↓[c2] in if p1 == p2 then size_rhanoi3 c1' c2' else (* one jump *) let p := `p[p1, p2] in let m1 := size_rpeg c1' p + size_rpeg c2' p in (* two jumps *) let m2 := size_rpeg c1' p2 + 2 ^ n1 + size_rpeg c2' p1 in (minn m1 m2).+1 else fun _ _ => 0. (* size computes the size *)
n:nat
c1, c2:configuration 3 n

size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
n:nat
c1, c2:configuration 3 n

size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1

(if c1 ldisk == c2 ldisk then size_rhanoi3 ↓[c1] ↓[c2] else (minn (size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk]) (size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk))).+1) = size (if c1 ldisk == c2 ldisk then [seq ↑[i]_(c1 ldisk) | i <- rhanoi3 ↓[c1] ↓[c2]] else if size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk] <= size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk) then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, c2 ldisk]] ++ ↑[`c[`p[c1 ldisk, c2 ldisk]]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg `p[c1 ldisk, c2 ldisk] ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_(`p[c1 ldisk, c2 ldisk]) :: [seq ↑[i]_(`p[c1 ldisk, c2 ldisk]) | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]])
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
E:c1 ldisk = c2 ldisk

size_rhanoi3 ↓[c1] ↓[c2] = size [seq ↑[i]_(c1 ldisk) | i <- rhanoi3 ↓[c1] ↓[c2]]
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
(minn (size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk]) (size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk))).+1 = size (if size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk] <= size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk) then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, c2 ldisk]] ++ ↑[`c[`p[c1 ldisk, c2 ldisk]]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg `p[c1 ldisk, c2 ldisk] ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_(`p[c1 ldisk, c2 ldisk]) :: [seq ↑[i]_(`p[c1 ldisk, c2 ldisk]) | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]])
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk

(minn (size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk]) (size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk))).+1 = size (if size_rpeg ↓[c1] `p[c1 ldisk, c2 ldisk] + size_rpeg ↓[c2] `p[c1 ldisk, c2 ldisk] <= size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk) then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] `p[c1 ldisk, c2 ldisk]] ++ ↑[`c[`p[c1 ldisk, c2 ldisk]]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg `p[c1 ldisk, c2 ldisk] ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_(`p[c1 ldisk, c2 ldisk]) :: [seq ↑[i]_(`p[c1 ldisk, c2 ldisk]) | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]])
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3

(minn (size_rpeg ↓[c1] p + size_rpeg ↓[c2] p) (size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk))).+1 = size (if size_rpeg ↓[c1] p + size_rpeg ↓[c2] p <= size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk) then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg p ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_p :: [seq ↑[i]_p | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]])
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat

(minn (x + y) (size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk))).+1 = size (if x + y <= size_rpeg ↓[c1] (c2 ldisk) + 2 ^ n + size_rpeg ↓[c2] (c1 ldisk) then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg p ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_p :: [seq ↑[i]_p | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]])
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat

(minn (x + y) (z + 2 ^ n + t)).+1 = size (if x + y <= z + 2 ^ n + t then [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg p ↓[c2]] else [seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_p :: [seq ↑[i]_p | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]])
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat

(minn (x + y) (z + 2 ^ n + t)).+1 = (if x + y <= z + 2 ^ n + t then size ([seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] p] ++ ↑[`c[p]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg p ↓[c2]]) else size ([seq ↑[i]_(c1 ldisk) | i <- rpeg ↓[c1] (c2 ldisk)] ++ ↑[`c[c2 ldisk]]_p :: [seq ↑[i]_p | i <- ppeg (c2 ldisk) (c1 ldisk)] ++ ↑[`c[c1 ldisk]]_(c2 ldisk) :: [seq ↑[i]_(c2 ldisk) | i <- lpeg (c1 ldisk) ↓[c2]]))
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat

(minn (x + y) (z + 2 ^ n + t)).+1 = (if x + y <= z + 2 ^ n + t then size (rpeg ↓[c1] p) + (size (lpeg p ↓[c2])).+1 else size (rpeg ↓[c1] (c2 ldisk)) + (size (ppeg (c2 ldisk) (c1 ldisk)) + (size (lpeg (c1 ldisk) ↓[c2])).+1).+1)
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat

(minn (x + y) (z + 2 ^ n + t)).+1 = (if x + y <= z + 2 ^ n + t then size_rpeg ↓[c1] p + (size_rpeg ↓[c2] p).+1 else size_rpeg ↓[c1] (c2 ldisk) + (size (ppeg (c2 ldisk) (c1 ldisk)) + (size_rpeg ↓[c2] (c1 ldisk)).+1).+1)
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat

(minn (x + y) (z + 2 ^ n + t)).+1 = (if x + y <= z + 2 ^ n + t then x + y.+1 else z + (size (ppeg (c2 ldisk) (c1 ldisk)) + t.+1).+1)
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat

(minn (x + y) (z + 2 ^ n + t)).+1 = (if x + y <= z + 2 ^ n + t then x + y.+1 else z + (2 ^ n + t).+1)
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat

(minn (x + y) (z + 2 ^ n + t)).+1 = (if x + y <= z + 2 ^ n + t then (x + y).+1 else (z + (2 ^ n + t)).+1)
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat

(if x + y < z + 2 ^ n + t then x + y else z + 2 ^ n + t).+1 = (if x + y <= z + 2 ^ n + t then (x + y).+1 else (z + 2 ^ n + t).+1)
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat
LL1:z + 2 ^ n + t <= x + y
LL2:x + y <= z + 2 ^ n + t

(z + 2 ^ n + t).+1 = (x + y).+1
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat
LL1:x + y < z + 2 ^ n + t
LL2:z + 2 ^ n + t < x + y
(x + y).+1 = (z + 2 ^ n + t).+1
n:nat
IH:forall c1 c2 : configuration 3 n, size_rhanoi3 c1 c2 = size (rhanoi3 c1 c2)
c1, c2:configuration 3 n.+1
NE:c1 ldisk != c2 ldisk
p:=`p[c1 ldisk, c2 ldisk]:peg 3
x:=size_rpeg ↓[c1] p:nat
y:=size_rpeg ↓[c2] p:nat
z:=size_rpeg ↓[c1] (c2 ldisk):nat
t:=size_rpeg ↓[c2] (c1 ldisk):nat
LL1:x + y < z + 2 ^ n + t
LL2:z + 2 ^ n + t < x + y

(x + y).+1 = (z + 2 ^ n + t).+1
by congr (_.+1); apply/eqP; rewrite eqn_leq ltnW // ltnW. Qed.
n:nat
c1, c2:configuration 3 n

`d[c1, c2]_rmove = size_rhanoi3 c1 c2
n:nat
c1, c2:configuration 3 n

`d[c1, c2]_rmove = size_rhanoi3 c1 c2
n:nat
c1, c2:configuration 3 n

`d[c1, c2]_rmove <= size_rhanoi3 c1 c2 <= `d[c1, c2]_rmove
n:nat
c1, c2:configuration 3 n

path rmove c1 (rhanoi3 c1 c2)
n:nat
c1, c2:configuration 3 n
last c1 (rhanoi3 c1 c2) = c2
n:nat
c1, c2:configuration 3 n
size (rhanoi3 c1 c2) <= `d[c1, c2]_rmove
n:nat
c1, c2:configuration 3 n

path rmove c1 (rhanoi3 c1 c2)
n:nat
c1, c2:configuration 3 n
last c1 (rhanoi3 c1 c2) = c2
n:nat
c1, c2:configuration 3 n
size (rhanoi3 c1 c2) <= `d[c1, c2]_rmove
n:nat
c1, c2:configuration 3 n

last c1 (rhanoi3 c1 c2) = c2
n:nat
c1, c2:configuration 3 n
size (rhanoi3 c1 c2) <= `d[c1, c2]_rmove
n:nat
c1, c2:configuration 3 n

last c1 (rhanoi3 c1 c2) = c2
n:nat
c1, c2:configuration 3 n
size (rhanoi3 c1 c2) <= `d[c1, c2]_rmove
n:nat
c1, c2:configuration 3 n

size (rhanoi3 c1 c2) <= `d[c1, c2]_rmove
n:nat
c1, c2:configuration 3 n
p1:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
p1H:gpath rmove c1 c2 p1

size (rhanoi3 c1 c2) <= `d[c1, c2]_rmove
n:nat
c1, c2:configuration 3 n
p1:seq (finfun_finType (ordinal_finType n) (ordinal_finType 3))
p1H:gpath rmove c1 c2 p1

last c1 p1 = c2
by apply: gpath_last p1H. Qed. End Hanoi3.